构建基本脚本
命令替换
shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量 。
有两种方法可以将命令输出赋给变量 :
- 反引号字符( `)
- $()格式
testing=$(date)
echo "The date and time are: " $testing
The date and time are: Mon Jan 31 20:23:25 EDT 2014
输出重定向
最基本的重定向将命令的输出发送到一个文件中。 bash shell用大于号( >)来完成这项功能:
command > outputfile
之前显示器上出现的命令输出会被保存到指定的输出文件中。
可以用双大于号( >>)来追加数据
输入重定向
输入重定向符号是小于号( <):
command < inputfile
一个简单的记忆方法就是:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动的方向。小于号说明数据正在从输入文件流向命令。
一种输入重定向的方法,称为内联输入重定向( inline input redirection)。 你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
command << marker
data
marker
管道
不要以为由管道串起的两个命令会依次执行。 Linux系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。
command1 | command2
执行数学运算
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的值
使用方括号
var1=$[1 + 5]
将一个数学运算结果赋给某个变量时,可以用美元符和方括号( $[ operation ])将数学表达式围起来。
同样,注意在使用方括号来计算公式时,不用担心shell会误解乘号或其他符号。 shell知道它 不是通配符,因为它在方括号内。
bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。
浮点解决方案
bc的基本用法
bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式,最后返回结果。
bash计算器能够识别:
- 数字(整数和浮点数)
- 变量(简单变量和数组)
- 注释(以#或C语言中的/* */开始的行)
- 表达式
- 编程语句(例如if-then语句)
- 函数
variable=$(bc << EOF
options
statements
expressions
EOF
)
退出脚本
查看退出状态码
Linux提供了一个专门的变量 ? 来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用 ?来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用 ?来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用?变量。它的值会变成由shell所执行的最后一条命令的退出状态码。
按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态码就是一个正数值。
- 0 命令成功结束
- 1 一般性未知错误
- 2 不适合的shell命令
- 126 命令不可执行
- 127 没找到命令
- 128 无效的退出参数
- 128+x 与Linux信号x相关的严重错误
- 130 通过Ctrl+C终止的命令
- 255 正常范围之外的退出状态码
exit 命令
默认情况下, shell脚本会以脚本中的最后一个命令的退出状态码退出。
你可以改变这种默认行为,返回自己的退出状态码。 exit命令允许你在脚本结束时指定一个退出状态码。
退出状态码被缩减到了0~ 255的区间。 shell通过模运算得到这个结果。一个值的模就是被除后的余数。
exit n