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 "[email protected]"

当调用这个脚本时,使用命令./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


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


e1=e2


等于


e1!=e2


不等于


e1<e2


小于


e1<=e2


小于或等于


e1>e2


大于


e1>=e2


大于或等于


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


e1+e2


e1与e2的加和


e1-e2


e1与e2的相减


e1*e2


e1与e2的相乘


e1/e2


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


e1%e2


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


e1:e2


e1与e2的BRE匹配


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 20:50:21

shell学习三十六天----命令替换的相关文章

linux学习记录-命令替换-通配符-重定向-管道

命令替换:$(command),`command` touch ./file-$(date +%F-%H-%M_%S).txt bash支持的引号有三种: ``:命令替换 "":弱引用,可以实现变量替换 '':强引用,不完成变量替换 文件名通配 globbing * 任意长度的任意字符 ? 任意长度单个 [] 匹配指定范围内的任意单个字符 [^] 匹配范围外的 > 覆盖 >> 追加输出 -C 禁止对已经存在文件使用覆盖重定向 强制覆盖输出,则使用>| +C 关闭

Linux Shell学习--awk命令详解

(1).awk介绍 awk是由Alfred Aho .Peter Weinberger 和 Brian Kernighan于1977年开发的变成语言,awk是上述三位创建者姓的首字母. Awk的基本语法与c语言类似,如果对c语言很熟悉,那么学习awk编程也将事半功倍. Awk功能与sed相似,都是用来进行文本处理的,awk语言可以从文件或字符串中基于指定规则浏览和抽取信息,在抽取信息的基础上,才能进行其他文本操作.   awk是一款设计用于数据流的工具.它颇有玩头的原因就在于可以对列和行进行操作

Linux Shell学习-sed命令详解

(1).sed介绍 Sed是流编辑器,stream editor,它是一个将一些列编辑命令作用于一批文本文件的理想工具. (2).sed工作原理 Sed是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入.文件重定向.字符串.变量,甚至来自管道的文本. Sed从文本的一个文本行或标准输入中读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令行或脚本中的所有命令都执行完毕. 相对于诸如vi等其他文本编辑器

Shell学习:sed命令

http://blog.sina.com.cn/s/blog_a56ef5490101cn58.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] ‘command’ 输入文本 常用选项:        -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上.但如果加

Linux Shell学习--curl命令详解

curl命令详解 (1).curl介绍 作为一款强力工具,curl支持包括HTTP.HTTPS.FTP在内的众多协议.它还支持POST.cookie.认证.从指定偏移处下载部分文件.参照页(referer).用户代理字符串.扩展头部.限速.文件大小限制.进度条等特性.如果要和网页访问序列(web page usagesequence)以及数据检索自动化打交道,那么curl定能助你一臂之力. (2).curl的help curl --help Usage: curl [options...] <u

Linux Shell学习--wget命令详解

(1).wget介绍 wget是一个用于文件下载的命令行工具,选项繁多且用法灵活. (2).wget的help [[email protected]_01 ~]# wget --help GNU Wget 1.12,非交互式的网络文件下载工具. 用法: wget [选项]... [URL]...   长选项所必须的参数在使用短选项时也是必须的.   开始:   -V,  --version           显示 Wget 的版本信息并退出.   -h,  --help            

【Shell脚本学习9】Shell替换:Shell变量替换,命令替换,转义字符

如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value of a is $a \n" 运行结果: Value of a is 10 这里 -e 表示对转义字符进行替换.如果不使用 -e 选项,将会原样输出: Value of a is 10\n 下面的转义字符都可以用在 echo 中: 转义字符 含义 \\ 反斜杠 \a 警报,响铃 \b 退格(删除键)

shell学习之tr命令

tr命令不接受指定的文件参数,而只是对标准输入进行翻译, tr是translate的简写,亦即翻译,需要注意的是,它不能翻译句子,只能翻译单个字符. 首先,定义变量:     [[email protected]]#A=1,,2,,,3,,,4,,,5 下面以示例对该命令以及其常用选项进行介绍. 示例: 1.  无选项设置情况     [[email protected]]# echo $A | tr  ',' ' '         1 2   3   4   5     [[email pr

第八章 shell学习之循环和结构化命令

for循环 1. 列表for循环 for variable in {list}  #有些像C++/CLR中的for each do ... done 如: 1. [[email protected] tmp]# cat b.sh #! /bin/bash for i in 1 2 3 4 5      #1 2 3 4 5等价于{1..5} do echo $i done [[email protected] tmp]# ./b.sh 1 2 3 4 5 2. [[email protected