《Linux命令行与shell脚本编程大全》第十一章
- 2023-04-10 10:00:00
- 王肖蒙
- 原创 781
11.1 使用多个命令
如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开。date命令先运行,显示了当前日期和时间,后面紧跟着who命令的输出,显示当前是谁登录到了系统上。
11.2 创建shell脚本文件
在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:#!/bin/bash
在通常的shell脚本中,井号(#)用作注释行。shell并不会处理shell脚本中的注释行。然而,shell脚本文件的第一行是个例外,#后面的惊叹号会告诉shell用哪个shell来运行脚本。
在指定了shell之后,就可以在文件的每一行中输入命令,然后加一个回车符。
可以根据需要,使用分号将两个命令放在一行上,但在shell脚本中,你可以在独立的行中书写命令。shell会按根据命令在文件中出现的顺序进行处理。
让shell找到test1脚本,只需采取以下两种作法之一:
- 将shell脚本文件所处的目录添加到PATH环境变量中;
- 在提示符中用绝对或相对文件路径来引用shell脚本文件。
11.3 显示消息
想要添加自己的文本消息来告诉脚本用户脚本正在做什么。可以通过echo命令来实现。默认情况下,不需要使用引号将要显示的文本字符串划定出来。但有时在字符串中出现引号的话就比较麻烦了。
echo命令可用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,你需要在文本中使用其中一种引号,而用另外一种来将字符串划定起来。
把文本字符串和命令输出显示在同一行中,可以用echo语句的-n参数。
echo命令是shell脚本中与用户交互的重要工具。
11.4 使用变量
11.4.1 环境变量
shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索路径。可以用set命令来显示一份完整的当前环境变量列表。在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量。
$USER、$UID和$HOME环境变量用来显示已登录用户的有关信息。
echo命令中的环境变量会在脚本运行时替换成当前值。
说明:你可能还见过通过${variable}形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。
11.4.2 用户变量
shell脚本允许在脚本中定义和使用自己的变量。用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格。
shell脚本会自动决定变量值的数据类型。
用户变量可通过美元符引用。
引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。
11.4.3 命令替换
shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。有两种方法可以将命令输出赋给变量:
- 反引号字符(`)
- $()格式
在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!
11.5 重定向输入和输出
11.5.1 输出重定向
将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:command > outputfile
11.5.2 输出重定向
输入重定向符号是小于号(<):command < inputfile
简单的记忆方法:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动的方向。小于号说明数据正在从输入文件流向命令。
wc命令可以对对数据中的文本进行计数。
- 文本的行数
- 文本的词数
- 文本的字节数
内联输入重定向符号是远小于号(<<)。
11.6 管道
将一个命令的输出作为另一个命令的输入。rpm命令通过Red Hat包管理系统(RPM)对系统(比如上例中的Fedora系统)上安装的软件包进行管理。配合-qa选项使用时,它会生成已安装包的列表,但这个列表并不会遵循某种特定的顺序。
我们用不着将命令输出重定向到文件中,可以将其直接重定向到另一个命令。这个过程叫作管道连接(piping)。
和命令替换所用的反引号(`)一样,管道符号在shell编程之外也很少用到。该符号由两个竖线构成,一个在另一个上面。然而管道符号的印刷体通常看起来更像是单个竖线(|)。在美式键盘上,它通常和反斜线(\)位于同一个键。
管道被放在命令之间,将一个命令的输出重定向到另一个命令中:
command1 | command2
管道命令运行:在第一个命令产生输出的同时,输出会被立即送给第二个命令。
11.7 执行数学运算
11.7.1 expr命令
expr命令允许在命令行上处理数学表达式,但是特别笨拙。操作符 |
描述 |
ARG1 | ARG2 |
如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2 |
ARG1 & ARG2 |
如果没有参数是null或零值,返回ARG1;否则返回0 |
ARG1 < ARG2 |
如果ARG1小于ARG2,返回1;否则返回0 |
ARG1 <= ARG2 |
如果ARG1小于或等于ARG2,返回1;否则返回0 |
ARG1 = ARG2 |
如果ARG1等于ARG2,返回1;否则返回0 |
ARG1 != ARG2 |
如果ARG1不等于ARG2,返回1;否则返回0 |
ARG1 >= ARG2 |
如果ARG1大于或等于ARG2,返回1;否则返回0 |
ARG1 > ARG2 |
如果ARG1大于ARG2,返回1;否则返回0 |
ARG1 + ARG2 |
返回ARG1和ARG2的算术运算和 |
ARG1 - ARG2 |
返回ARG1和ARG2的算术运算差 |
ARG1 * ARG2 |
返回ARG1和ARG2的算术乘积 |
ARG1 / ARG2 |
返回ARG1被ARG2除的算术商 |
ARG1 % ARG2 |
返回ARG1被ARG2除的算术余数 |
STRING : REGEXP |
如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配 |
match STRING REGEXP |
如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配 |
substr STRING POS LENGTH |
返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串 |
index STRING CHARS |
返回在STRING中找到CHARS字符串的位置;否则,返回0 |
length STRING |
返回字符串STRING的数值长度 |
+ TOKEN |
将TOKEN解释成字符串,即使是个关键字 |
(EXPRESSION) |
返回EXPRESSION的值 |
11.7.2 使用方括号
在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式围起来。在使用方括号来计算公式时,不用担心shell会误解乘号或其他符号。
11.7.3 浮点解决方案
bc的基本用法bash计算器能够识别:
1. 数字(整数和浮点数)
2. 变量(简单变量和数组)
3. 注释(以#或C语言中的/* */开始的行)
4. 表达式
5. 编程语句(例如if-then语句)
6. 函数
在脚本中使用bc
用命令替换运行bc命令。
variable=$(echo "options; expression" | bc)
第一部分options允许你设置变量。如果你需要不止一个变量,可以用分号将其分开。expression参数定义了通过bc执行的数学表达式。
11.8 退出脚本
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值。11.8.1 查看退出状态码
$?来保存上个已执行命令的退出状态码。一个成功结束的命令的退出状态码是0。
状态码 |
描述 |
0 |
命令成功结束 |
1 |
一般性未知错误 |
2 |
不适合的shell命令 |
126 |
命令不可执行 |
127 |
没找到命令 |
128 |
无效的退出参数 |
128+x |
与Linux信号x相关的严重错误 |
130 |
通过Ctrl+C终止的命令 |
225 |
正常范围之外的退出状态码 |
11.8.2 exit命令
exit命令允许你在脚本结束时指定一个退出状态码。当查看脚本的退出码时,你会得到作为参数传给exit命令的值。
也可以在exit命令的参数中使用变量。
暂时没有记录