> 文章列表 > shell脚本在哪里写(shell脚本的作用)

shell脚本在哪里写(shell脚本的作用)

前言:

一、多个shell命令的使用

shell脚本的核心在于输入多个命令并处理每个命令的结果,而且有时候需要将一个命令的结果传给

另一个命令。shell可以将命令串起来,依次执行完成。要依次将两个命令一起运行,可以 把它们放在同一行中,彼此间用分号(;)隔开来。

shell脚本在哪里写(shell脚本的作用)

这就是一个最简单的shell脚本,运行了两个shell命令,who命令先运行,输出了当前是谁登录了系统,而后运行了whoami,输出的是当前有效用户名。使用这个方式可以运行多个命令,它们都是以此串行的。

二、构建一个shell文件

构建一个shell文件,最简单的理解就是将类似上述的命令放在一个文本文件里,文本文件的核心开头是:

该行内容必须放在文本的第一行,表示使用的shell类型;本文以常用的bash为例,更多了类型的shell可以参考此文。

在第一行的内容后面,就可以写入你要执行的shell命令了,可以都写在一行,用分号隔开,但是一般情况下,为了美观和更高的辨识度,我们选择一行写一个命令,加上一个回车符,在输入另一个命令。好比下图:

shell脚本在哪里写(shell脚本的作用)

推荐格式:

shell脚本在哪里写(shell脚本的作用)

需要说明的是,你可以在文本中用\"#\"来注释你的内容,这样这些被注释的内容,shell就不会识别和执行了,一般我们会在脚本中写一些说明性的描述,这时需要用到\"#\"。如下图:

shell脚本在哪里写(shell脚本的作用)

上述可以是一个完整的shell脚本了,可以直接保存为脚本文件test1,但是此时我们如果直接执行test1文件的话,还是不能达到效果的,会提示 command not found,这里就需要提到shell里的PATH环境变量的概念。shell 命令的查找都是通过环境变量的。

shell脚本在哪里写(shell脚本的作用)

我们可以查看当前主机的环境变量:

shell脚本在哪里写(shell脚本的作用)

此时我们的test1命令并没有生效,如果我们想要使其神效,可以采用这两个方式:

  • 将shell脚本文件所处的目录添加到PATH环境变量中;
  • 在提示符中用绝对或相对文件路径来引用shell脚本文件;

经验提示:

在本文中,我们将用第二种方式将脚本文件的确切位置告诉shell。记住,为了引用当前 目录下的文件,可以在shell中使用单点操作符,如下图:

shell脚本在哪里写(shell脚本的作用)

核心说明:

shell脚本在哪里写(shell脚本的作用)

chmod u x test1 添加权限后:

shell脚本在哪里写(shell脚本的作用)

此时脚本文件就可以正常执行了。

shell脚本在哪里写(shell脚本的作用)

实战解说:

shell脚本在哪里写(shell脚本的作用)

三、终端打印消息

很多时候shell都会输出一定的内容到终端,我们如果也想在脚本中输出一些内容到终端显示,告诉执行脚本的人,这个脚本在执行哪些功能,这个时候我们就需要用到echo命令来辅助。

最简单的输出如下:

shell脚本在哪里写(shell脚本的作用)

echo 命令会将跟在它后面的字符串打印到终端屏幕。

注意,默认情况下,不需要使用引号将要显示的文本字符串划定出来。但有时在字符串中出现引号的话就比较麻烦了。

如下图:

shell脚本在哪里写(shell脚本的作用)

此时我们如果想要引号也输出在终端的话,需要这样做:echo \"Let\'s see if this\'ll work\"

shell脚本在哪里写(shell脚本的作用)

核心总结:

此时我们就可以在脚本文件中任意位置使用echo来输出我们打算输出的内容了。如下图:

shell脚本在哪里写(shell脚本的作用)

常用的组合命令参数:

  • -n 不换行输出

shell脚本在哪里写(shell脚本的作用)

  • -e 处理特殊字符

shell脚本在哪里写(shell脚本的作用)

实战解说:

在实际的使用中,我们通常也会使用echo 配合>>将内容追加到文本文件中,如下图:

shell脚本在哪里写(shell脚本的作用)

四、变量的使用

4.1 环境变量

shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用 户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索径。可以用 set命令来显示一份完整的当前环境变量列表。

如下图:

shell脚本在哪里写(shell脚本的作用)

在脚本中,变量的使用格式是:$变量名称

下面是变量在脚本中的使用,可以看到

shell脚本在哪里写(shell脚本的作用)

实战解说:

shell脚本在哪里写(shell脚本的作用)

变量用{}包括起来:

shell脚本在哪里写(shell脚本的作用)

4.2 用户变量

变量示例:

shell脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell脚本中定义的变量 会一直保持着它们的值,但在shell脚本结束时会被删除掉。 与系统变量类似,用户变量可通过$引用。

示例截图:

shell脚本在哪里写(shell脚本的作用)

核心解说:

演示截图:

shell脚本在哪里写(shell脚本的作用)

如果没有使用$符,shell会将变量名解释成普通的文本字符串,通常这并不是你想要的结果。

shell脚本在哪里写(shell脚本的作用)

4.3命令替换

两种操作方式:

  • 反引号字符(`)
  • $()

核心解说:

如下示例:

用一对反引号把整个命令行命令围起来:

day=\'date\'

使用$()格式:

day=$(date)

shell会运行命令替换符号中的命令,并将其输出赋给变量testing。注意,赋值等号和命令

替换字符之间没有空格。这里有个使用普通的shell命令输出创建变量的例子。

shell脚本在哪里写(shell脚本的作用)

实战详解:

五、重定向输入和输出

5.1 输出重定向

最基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:

使用格式:

之前显示器上出现的命令输出会被保存到指定的输出文件中。

shell脚本在哪里写(shell脚本的作用)

重定向操作符创建了一个文件1.txt(通过默认的umask设置),并将echo命令的输出重定向

到该文件中。如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。

shell脚本在哪里写(shell脚本的作用)

很多时候我们可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,比如在创建一个记录系统上某个操作的日志文件。在这种情况下,可以用双大于号(>>)来追加数据。

shell脚本在哪里写(shell脚本的作用)

可以看到,who命令产生的内容并没有覆盖1.txt中已有的内容,而是追加到文件的末尾。

5.2 输入重定向

输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的

输出重定向到文件。

输入重定向符号是小于号(<):

命令格式:

一个简单的记忆方法就是:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动

的方向。小于号说明数据正在从输入文件流向命令。

shell脚本在哪里写(shell脚本的作用)

wc命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:

  • 文本的行数
  • 文本的词数
  • 文本的字节数

通过将文本文件重定向到wc命令,你立刻就可以得到文件中的行、词和字节的计数。这个例 子说明1.txt文件有2行、11个单词以及83字节。

还有另外一种输入重定向的方法,称为内联输入重定向(inline input redirection)。这种方法 无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。乍看一眼, 这可能有点奇怪,但有些应用会用到这种方式。

内联输入重定向符号是远小于号(<<)。除了这个符号,你必须指定一个文本标记来划分输 入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。

command << EOF

data

EOF

在命令行上使用内联输入重定向时,shell会用PS2环境变量中定义的次提示符(参见第6章)

来提示输入数据。下面是它的使用情况。

shell脚本在哪里写(shell脚本的作用)

六、管道

Linux 管道使用竖线|连接多个命令,这被称为管道符。Linux 管道的具体语法格式如下:

command1 | command2 command1 | command2 [ | commandN... ]

核心讲解:

使用示例:

a. 工作中常用的就是配合grep 使用,下图表示的意思是,将cat读取出来的文本内容发送到 grep 命令;

shell脚本在哪里写(shell脚本的作用)

b. 使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示,这对于查看长度大于一个屏幕的文件内容很有帮助。

shell脚本在哪里写(shell脚本的作用)

c. 查看指定程序的进程运行状态,并将输出重定向到文件中。

shell脚本在哪里写(shell脚本的作用)

编辑d.统计系统中当前登录的用户数。

shell脚本在哪里写(shell脚本的作用)

七、执行数学运算

7.1 expr 命令

expr 是 evaluate expressions 的缩写,译为“表达式求值”。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。

shell脚本在哪里写(shell脚本的作用)

expr 对表达式的格式有几点特殊的要求:

  • 出现在表达式中的运算符、数字、变量和小括号的左右两边至少要有一个空格,否则会报错。
  • 有些特殊符号必须用反斜杠\\进行转义(屏蔽其特殊含义),比如乘号*和小括号(),如果不用\\转义,那么 Shell 会把它们误解为正则表达式中的符号(*对应通配符,()对应分组)。
  • 使用变量时要加$前缀。
[root@bd15-21-131-161 ~]# expr 23#错误:加号和 3 之前没有空格expr: syntax error[root@bd15-21-131-161 ~]# expr 2 3#这样才是正确的5[root@bd15-21-131-161 ~]# expr 4 * 5 #错误:乘号没有转义expr: syntax error[root@bd15-21-131-161 ~]# expr 4 \\* 5#使用 \\ 转义后才是正确的20[root@bd15-21-131-161 ~]# expr ( 2 3 ) \\* 4#小括号也需要转义-bash: syntax error near unexpected token `2\'[root@bd15-21-131-161 ~]# expr \\( 2 3 \\) \\* 4 #使用 \\ 转义后才是正确的20[root@bd15-21-131-161 ~]# n=3[root@bd15-21-131-161 ~]# expr n 2 expr: non-numeric argument[root@bd15-21-131-161 ~]# expr $n 2#使用变量时要加 $5[root@bd15-21-131-161 ~]#m=7[root@bd15-21-131-161 ~]# expr $m \\* \\( $n 5 \\)56

以上是直接使用 expr 命令,计算结果会直接输出,如果你希望将计算结果赋值给变量,那么需要将整个表达式用反引号``(位于 Tab 键的上方)包围起来,请看下面的例子。

shell脚本在哪里写(shell脚本的作用)

实战详解:

7.2 使用方括号[ ]

shell脚本在哪里写(shell脚本的作用)

用方括号执行shell数学运算比用expr命令方便很多。这种技术也适用于shell脚本。

shell脚本在哪里写(shell脚本的作用)

需要额外注意的是bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。如下图:

shell脚本在哪里写(shell脚本的作用)

八、退出脚本

8.1 查看退出状态码

shell脚本在哪里写(shell脚本的作用)

如果命令成功结束,那么它退出的状态码就是 0,如果是失败的,那状态码就是一个非零的正数值。

shell脚本在哪里写(shell脚本的作用)

无效命令会返回一个退出状态码127。Linux错误退出状态码没有什么标准可循,但有一些可

用的参考,如下图:

shell脚本在哪里写(shell脚本的作用)

退出状态码126表明用户没有执行命令的正确权限。

shell脚本在哪里写(shell脚本的作用)

另一个会碰到的常见错误是给某个命令提供了无效参数。

shell脚本在哪里写(shell脚本的作用)

8.2 exit

Shell 进程执行出错时,可以根据退出状态来判断具体出现了什么错误,比如打开一个文件时,我们可以指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

shell脚本在哪里写(shell脚本的作用)

可以看到,\"after exit\"并没有输出,这说明遇到 exit 命令后,test1执行就结束了。

实战详解:

<!--):