Shell脚本入门

一、什么是shell?

shell是一个用C语言编写的程序,是用户使用Linux的桥梁。shell既是一种命令语言,又是一种程序设计语言,可以说Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。。

二、什么是shell脚本?

shell脚本(shell script)是一种为shell编写的脚本程序。业界所说的shell通常是指shell脚本,但是要知道shell与shell script是两个不同的概念。

三、如何编写shell脚本?

1.要创建一个脚本,可以用touch指令创建一个空的.sh后缀的脚本。

2.在第一行中添加一个约定的标记:  #!/bin/bash,意为告诉脚本用哪一种shell解释器来执行。

3.在脚本中编写命令,完成后用: :wq! 保存

4.添加运行权限,方法为chmod+x脚本名.添加权限后./脚本名即可运行脚本

5.shell解释器是什么?

shell解释器也是一个程序,当我们登陆linux系统,输入用户名和密码后,就已经开始执行shell解释器程序来,通常是/bin/bash也可以是别的,比如/bin/sh

四、常见的 Shell 有 那些?

Linux 是一个开源的操作系统,由分布在世界各地的多个组织机构或个人共同开发完成,每个组织结构或个人负责一部分功能,最后组合在一起,就构成了今天的 Linux。例如:

  • Linux 内核最初由芬兰黑客 Linus Torvalds 开发,后来他组建了团队,Linux 内核由这个团队维护。
  • GNU 组织开发了很多核心软件和基础库,例如 GCC 编译器C语言标准库、文本编辑器 Emacs、进程管理软件、Shell 以及 GNOME 桌面环境等。
  • VIM 编辑器由荷兰人 Bram Moolenaar 开发。

1.sh

sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。

sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

2.sh

sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。

Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。

BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。

3.tcsh

tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

4.ash

一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

5.bash

bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。

bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。

注意:bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。

尽管如此,bash 和 sh 还是有一些不同之处:

一方面,bash 扩展了一些命令和参数;
另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。

五、在linux系统下如何查看shell?

Shell 是一个程序,一般都是放在/bin或者/usr/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。

通过 cat 命令来查看当前 Linux 系统的可用 Shell:

$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

特别提醒

在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。

如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:

$ echo $SHELL
/bin/bash

输出结果表明默认的 Shell 是 bash。

echo是一个 Shell 命令,用来输出变量的值。SHELL是 Linux 系统中的环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用的哪个 Shell。

六、在Linux系统下编写一个Shell 程序

一、编写shell脚本文件:

打开文本编辑器,新建一个文本文件,并命名为 test01.sh。

注意:扩展名sh代表 shell,扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用php好了。

 

在 test01.sh 中输入代码:

#!/bin/bash
echo "Hello World !" #这是一条语句

第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash就是指明了解释器的具体位置

第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指显示器)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。

第 2 行的#及其后面的内容是注释。Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)。写脚本的时候,多写注释是非常有必要的,以方便其他人能看懂你的脚本,也方便后期自己维护时看懂自己的脚本——实际上,即便是自己写的脚本,在经过一段时间后也很容易忘记。

下面给出了一段稍微复杂的 Shell 脚本:

#!/bin/bash
# Copyright (c) http://c.biancheng.net/shell/

echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

第 5 行中表示从终端读取用户输入的数据,并赋值给 PERSON 变量read 命令用来从标准输入文件(Standard Input,stdin,一般就是指键盘)读取用户输入的数据。

第 6 行表示输出变量 PERSON 的内容。注意在变量名前边要加上$否则变量名会作为字符串的一部分处理。

 

二、执行shell脚本

行 Shell 脚本有两种方法,一种在新进程中运行,一种是在当前 Shell 进程中运行

1)在新进程中运行 Shell 脚本

在新进程中运行 Shell 脚本有多种方法。

1) 将 Shell 脚本作为程序运行

Shell 脚本也是一种解释执行的程序,可以在终端直接调用(需要使用 chmod 命令给 Shell 脚本加上执行权限),如下所示:

[gufengchen@localhost ~]$ cd demo                #切换到 test.sh 所在的目录
[gufengchen@localhost demo]$ chmod +x ./test.sh  #给脚本添加执行权限
[gufengchen@localhost demo]$ ./test.sh           #执行脚本文件
Hello World !                                  #运行结果

第 2 行中,chmod +x表示给 test.sh 增加执行权限。

第 3 行中,./表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。

通过这种方式运行脚本,脚本文件第一行的#!/bin/bash一定要写对,好让系统查找到正确的解释器。

 

2) 将 Shell 脚本作为参数传递给 Bash 解释器

你也可以直接运行 Bash 解释器,将脚本文件的名字作为参数传递给 Bash,如下所示:

[gufengchen@localhost ~]$ cd demo               #切换到 test.sh 所在的目录
[gufengchen@localhost demo]$ /bin/bash test.sh  #使用Bash的绝对路径
Hello World !                                 #运行结果

通过这种方式运行脚本,不需要在脚本文件的第一行指定解释器信息,写了也没用。(不需要使用chmod + 赋权限

更加简洁的写法是运行 bash 命令。bash 是一个外部命令,Shell 会在 /bin 目录中找到对应的应用程序,也即 /bin/bash

不需要使用chmod + 赋权限

[gufengchen@localhost ~]$ cd demo
[gufengchen@localhost demo]$ bash test.sh
Hello World 

这两种写法在本质上是一样的:第一种写法给出了绝对路径,会直接运行 Bash 解释器;第二种写法通过 bash 命令找到 Bash 解释器所在的目录,然后再运行,只不过多了一个查找的过程而已。

三 、完整的shell脚本程序编写用例及执行:

1、新建一个 xx.sh文件;

2、使用vi或者vim命令编辑xx.sh文件并保存:

3、使用chmod给脚本文件赋予执行权限:chmod a+x./xx.sh

4、执行shell脚本./xx.sh

 

四、在当前进程中运行 Shell 脚本

这里需要引入一个新的命令——source 命令。source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。

source 命令的用法为:

source filename

也可以简写为:

. filename

两种写法的效果相同。对于第二种写法,注意点号.和文件名中间有一个空格

比如,使用 source 运行上节的 test05.sh:

[gufengchen@localhost test]$ vim test05.sh   #编写一个shell脚本文件
[gufengchen@localhost test]$ source ./test05.sh   #使用source ./ 运行
Hello World

[gufengchen@localhost test]$ source test05.sh     #使用source 
Hello World

[gufengchen@localhost test]$ . test05.sh     #使用 . 执行
Hello World


[gufengchen@localhost test]$ cat test05.sh
#!/bin/bash
echo "Hello World" #输出Hello World

[gufengchen@localhost test]$ 

使用 source 命令不用给脚本增加执行权限,并且写不写./都行,是不是很方便。

[gufengchen@localhost test]$ echo $$
9102      #当前进程PID
[gufengchen@localhost test]$ source ./check.sh
9102      #Shell脚本所在进程PID
[gufengchen@localhost test]$ echo $$
9102      #当前进程PID
[gufengchen@localhost test]$ . ./check.sh
9102      #Shell脚本所在进程PID
[gufengchen@localhost test]$ 

进程的 PID 都是一样的,当然是同一个进程了

如果需要在新进程中运行 Shell 脚本,我一般使用bash test.sh这种写法;如果在当前进程中运行 Shell 脚本,我一般使用. ./test.sh这种写法。这是我个人的风格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值