使用多个命令
使用变量
输入输出重定向
管道
数学运算
退出脚本
使用多个命令
$ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 2014-02-21 15:26 Samantha tty3 2014-02-21 15:26 Timothy tty1 2014-02-21 15:26 user tty7 2014-02-19 14:03 (:0) user pts/0 2014-02-21 15:21 (:0.0)
使用变量
环境变量
$ cat test2 #!/bin/bash # display user information from the system. echo "User info for userid: $USER" echo UID: $UID echo HOME: $HOME
$ echo "The cost of the item is $15" The cost of the item is 5 反斜线允许shell脚本将美元符解读为实际的美元符,而不是变量 $ echo "The cost of the item is $15" The cost of the item is $15
用户变量
$ cat test3 #!/bin/bash # testing variables days=10 guest="Katie" echo "$guest checked in $days days ago" days=5 guest="Jessica" echo "$guest checked in $days days ago" $ 运行脚本会有如下输出。 $ chmod u+x test3 $ ./test3 Katie checked in 10 days ago Jessica checked in 5 days ago $
命令替换
有两种方法可以将命令输出赋给变量:
反引号字符( ` )
$() 格式
testing='date' 或 testing=$(date)
通过命令替换获得当前日期并用它来生成唯一文件名。 #!/bin/bash # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d) ls /usr/bin -al > log.$today $ date +%y%m%d 140131 $
警告 命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。
在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!
重定向输入和输出
输出重定向
command > outputfile
$ date > test6 $ ls -l test6 -rw-r--r-- 1 user user 29 Feb 10 17:56 test6 $ cat test6 Thu Feb 10 17:56:58 EDT 2014 $
command < inputfile
wc 命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:
- 文本的行数
- 文本的词数
- 文本的字节数
$ wc < test6 2 11 60 $
管道
command1 | command2
执行数学运算
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的值
$ cat test6 #!/bin/bash # An example of using the expr command var1=10 var2=20 var3=$(expr $var2 / $var1) echo The result is $var3 要将一个数学算式的结果赋给一个变量,需要使用命令替换来获取 expr 命令的输出: $ chmod u+x test6 $ ./test6 The result is 2 $
使用方括号
$ cat test7 #!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo The final result is $var4 $ 运行这个脚本会得到如下输出。 $ chmod u+x test7 $ ./test7 The final result is 500 $
浮点解决方案
bc的基本用法
bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该
表达式,最后返回结果。bash计算器能够识别:
- 数字(整数和浮点数)
- 变量(简单变量和数组)
- 注释(以#或C语言中的 /* */ 开始的行)
- 表达式
- 编程语句(例如 if-then 语句)
- 函数
浮点运算是由内建变量 scale 控制的。scale 变量的默认值是 0 。
$ bc -q 3.44 / 5 0 scale=4 3.44 / 5 .6880 quit $
在脚本中使用bc
$ cat test10 #!/bin/bash var1=100 var2=45 var3=$(echo "scale=4; $var1 / $var2" | bc) echo The answer for this is $var3 $ #脚本定义了两个变量,它们都可以用在 expression 部分,然后发送给 bc 命令。别忘了用美元符表示的是变量的值而不是变量自身。这个脚本的输出如下。 $ ./test10 The answer for this is 2.2222 $
退出脚本
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。
查看退出状态码
- 0 命令成功结束
- 1 一般性未知错误
- 2 不适合的shell命令
- 126 命令不可执行
- 127 没找到命令
- 128 无效的退出参数
- 128+x 与Linux信号x相关的严重错误
- 130 通过Ctrl+C终止的命令
- 255 正常范围之外的退出状态码
$ asdfg -bash: asdfg: command not found $ echo $? 127 $
exit 命令
退出状态码被缩减到了0~255的区间。shell通过模运算得到这个结果。一个值的模就是被除后的余数。最终的结果是指定的数值除以256后得到的余数。在这个例子中,指定的值是 300 (返回值),余数是44,因此这个余数就成了最后的状态退出码。
$ cat test14b #!/bin/bash # testing the exit status var1=10 var2=30 var3=$[$var1 * $var2] echo The value is $var3 exit $var3 $ $ ./test14b The value is 300 $ echo $? 44 $