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

来源:互联网 发布:一夫多妻体验知乎 编辑:程序博客网 时间:2024/05/16 07:59

命令替换

命令替换是指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

使用sedhead命令来显示文件的前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的运算符同时也是shellmeta字符,所以必须谨慎使用引号.

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或是shellcase语句来完成.

 

案例一:计算字符串长度

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位的算术运算----在很多系统上都可以,因此,几乎不会有计数器溢出的问题.

 

0 0