离线下载
PDF版 ePub版

见证大牛成长之路 · 更新于 2018-11-28 11:00:43

shell 学习三十六天---命令替换

命令替换是指 shell 可以先执行命令,将输出结果暂时保存,在适当的地方输出.
命令替换的语法:
command
注意这是反引号,而不是单引号,这个键位于 ESC 键的下方.
案例;

 #!/bin/bash  
DATE=`date`  
echo "Date is $DATE"  

USERS=`who | wc -l`  
echo "Logged in user are $USERS"  
UP=`date ; uptime`  
echo "Uptime is $UP"  

执行结果:

Date is 2015年 07月 04日 星期六 10:54:22 CST
Logged in user are 1
Uptime is 2015年 07月 04日 星期六 10:54:22 CST
10:54:22 up 1:22, 1 user, load average: 0.00, 0.00, 0.00

为 head 命令使用 sed
使用 sed 的 head 命令来显示文件的前 n 行.真实的 head 命令可加上选项,以指定要显示多少行.例如 head -n 10 /etc/passwd.
使用命令替换与 sed,使其与原始的 head 版本的工作方式相同:

 #!/bin/bash  
count=$(echo $1 | sed 's/^-//')     #截去前置的负号  
shift                         #移除$1  
sed ${count}q "$@"  

当调用这个脚本时,使用命令./head.sh -10 /etc/passwd调用这个脚本时,sed 最终是以 sed 10q /etc/passwd 被引用.

案例:发一封邮件信息给当前已登录的所有用户:
mail $(who | cut -d ' ' -f1)
使用 who 命令获得当前在线用户,使用 cut 获得用户的名称,把括号内命令生成的结果先执行,然后作为 mail 参数.
回顾一下 cut 命令:
语法:cut 选项 参数
主要是用来从一个文本文件或者文本流中提取文本列.

主要选项:
-b,-c,-f 分别表示字节,字符,字段(即 byte,character,field)
-d:使用指定分界符代替制表符作为区域分界
-f :只选中指定的这些域;并打印所有不包含分界符的行,除非-s选项被指定.
-s:不打印没有分界符的行
--output-delimiter=字符串 //使用指定的字符串作为输出分界符,默认采用输入的分界符.

简易教学:expr
expr 命令是一个手工命令行计数器,用于在 UNIX/LINUX 下求表达式变量的值,一般用于整数值,也可用于字符串。
–格式为:
expr Expression(命令读入 Expression 参数,计算它的值,然后
将结果写入到标准输出)–参数应用规则:
用空格隔开每个项;
用 / (反斜杠) 放在 shell 特定的字符前面;
对包含空格和其他特殊字符的字符串要用引号括起来
expr 主要用于 shell 的算术运算.expr 的语法很麻烦:运算数与运算符必须是单个的命令行参数;因此建议在这里大量使用空格间隔它们.很多 expr 的运算符同时也是 shell 的 meta 字符,所以必须谨慎使用引号.
expr 被设置用在命令替换之内.这样,它会通过打印的方式把值返回到标准输出,而非通过使用退出码(也就是 shell 内的$?).

            expr运算符(优先级由小至大)

表达式

意义

e1 | e2

如果e1是非零值或非null,则使用它的值.否则如果e2是非零值或非null,则使用它的值.如果两者都不是,则最后值为零

e1&e2

如果e1e2都非零值或非null,则返回e1的值.否则,最后值为零

e1=e2

等于

e1!=e2

不等于

e1<e2

小于

e1<=e2

小于或等于

e1>e2

大于

e1>=e2

大于或等于

以上这些运算符,如果指示的比较为真,则会使得expr显示1,否则显示0.如果两个运算符都为整数,则以数字方式比较;如果不是,则以字符串方式比较

e1+e2

e1e2的加和

e1-e2

e1e2的相减

e1*e2

e1e2的相乘

e1/e2

e1除以e2的整数结果(取整)

e1%e2

e1除以e2的整数结果(取余)

e1:e2

e1e2BRE匹配

integer 

一个只包含数字的数目,允许前置负号,但却不支持一元的正号

string

字符串值,不允许被误用为数字或运算符

在新的代码里,可以使用 test 或$((...))进行这里所有运算.正则表达式的匹配与提取,也可搭配 sed 或是 shell 的 case 语句来完成.

案例一:计算字符串长度
expr length “this is a test”
输出:14
案例二:抓取字串
expr substr “this is a test”
输出:is is
案例三:抓取第一个字符数字串出现的位置
expr index “qweasdzxcasdqwe” a
输出:4
案例四:整数运算
expr 14 % 9(空格隔开)
输出:5
其他运算符相同
案例五:增量计算
test=0
test=expr $LOOP + 1(这里的是反引号,ESC下面的那个键)
案例六:数值测试
说明:用 expr 测试一个数。如果试图计算非整数,则会返回 错误。

rr=3.4  
expr $rr + 1  
expr: non-numeric argument  
rr=5  
expr $rr + 1  
6  

案例七:
$ a=2
$ b=3
$ c=expr $a + $b//`是Tab上面的那个按键,意思在这行里面
两个``之间的命令最先执行
$ echo $c
你还可以用这种方面来计算:

$ a=2  
$ b=3  
$ c=$(($a+$b))  
$ echo $c  

解释一下:$((里面能进行运算))
更详细的参考:
http://blog.csdn.net/guhong5153/article/details/6542995
案例:

 #!/bin/bash  
i=1  
while [ "$i" -le 5 ]  
do  
        echo i is $i  
        i=`expr $i + 1`  
done  
echo $i  

输出:

i is 1  
i is 2  
i is 3  
i is 4  
i is 5  
6  

这类的算术运算,已经给出了可能遇到的 expr 的使用方式 99%.故意在这里使用 test (别名用法为[...])以及反引号的命令替换,因为这是 expr 的传统用法.
在新的代码里,使用 shell 的内建算术替换应该会更好:

 #!/bin/bash  
i=1  
while [ "$i" -le 5 ]  
do  
        echo i is $i  
        i=$(($i+1))  
done  
echo $i  

无论 expr 的价值如何,它支持 32 位的算术运算,也支持 64 位的算术运算----在很多系统上都可以,因此,几乎不会有计数器溢出的问题.

上一篇: 波浪号展开与通配... 下一篇: 引用