Shell编程基础(第3篇:命令替换)

前言

    命令替换是bash编程的核心技术点之一,用于获取任何命令的标准输出,然后我们就可以在程序中对命令的标准输出进行文本处理,我建议大家把命令替换理解了,才能知道自己写的是什么!

概念

    命令替换,也称子命令替换,可以获取到命令的标准输出,注意:不能获取命令的标准错误

    备注:函数、别名、等等只要是有标准输出的都能获取,参考命令的含义

创建命令替换的2种方式

1、反引号

早期的命令替换语法,不推荐使用,缺点是不支持嵌套的命令替换、且语法怪异……

这个反引号位于键盘中数字1的左侧……

temp=`date`

echo $temp

2、$()

$()是新增的规范,优点是支持嵌套的命令替换,我们现在都用这个

temp=$(date)

echo $temp

强调``与$()的区别

$()方式的能力更强,它支持嵌套语法,而反引号``方式不支持命令替换的嵌套,举个例子

temp=$(seq $(ls -1 | wc -l))

echo $temp

seq命令会根据传送给它的参数,返回从1开始的序列,$()支持嵌套,所以在$()内部的$()将先执行

,如果是反引号的方式将无法支持如此复杂的嵌套语法

执行过程:

1、内部的ls -l | wc -l 会先执行,它的标准输出,即wc的标准输出会作为下一个

$(ls -1 | wc -l)

2、接下来是seq命令的执行,参数则为上一步返回的标准输出,假定返回的是5

$(seq 5)

3、temp保存的是seq命令的标准输出(本身seq返回的是换行符组成的数字,保存到temp的时候变成了空格字符)

temp="1 2 3 4 5"

命令替换拿到的标准输出,自动替换为空格字符

你会发现a并不是按照换行符展示的,而是都被替换成了空格字符,奇怪,那android那些个程序,比如dumpsys,怎么提出来对应值的?

a=$(ls -l)

echo $a

命令替换嵌套的执行过程再解释

temp=$(seq $(ls -1 | wc -l))

echo $temp

等价于

num=$(ls -l | wc -l)

temp=$(seq $num)

echo $temp

嵌套在内部的命令替换会先执行,执行完毕后,才是外部的命令替换执行

巧妙利用命令替换模拟从函数中获取返回值

shell编程中的函数使用return返回的是退出状态码,而我们只有通过命令替换去间接模拟函数的返回值

print_hello() {
    echo hello world
}


my_print=$(print_hello)

echo ${my_print}

注意:此时函数中的所有命令的标准输出都会被获取到,所以需要注意命令的标准输出

能否获取标准错误?

在shell编程中,$()是用于命令替换的语法,它可以将命令标准的输出作为字符串返回,无法获取标准错误输出,你可以使用重新向技术将结果存储到文件中,再去读取文件即可。

总结

1、命令替换,用于执行命令并且获取命令的标准输出,无法获取标准错误

2、命令替换在命令行中会被优先执行,可以根据需求,将其放置在命令行的任意位置

3、记住这句话:bash解释器会先执行命令替换,然后执行命令(同变量替换一样)

echo $(date)  #对于echo命令,它只会看到date命令的输出结果,根本看不到$(date)

4、两种命令替换的方式,$()支持继续嵌套命令替换,反引号``不支持嵌套,建议使用$()

5、命令替换获取到的标准输出,换行字符全部变成了空格字符

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值