前言
命令替换是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、命令替换获取到的标准输出,换行字符全部变成了空格字符