指令替换
$()和``是可以用来指令替换的,即指令的值替换$()的部分。比如:
a=`expr 3 + 4`
echo $a
b=$(expr $a \* 3)
echo $b
结果分别为:7和21。
条件判定
可以用[空格 + 条件 + 空格]的形式来作为条件判断,可用于if, while或者用&&(与), ||(或)组合成条件组合。看代码:
[ 2 -lt 4 ] && echo "2 is less than(-lt) 4"
[ 3 -ne 5 ] && echo "3 is not equal(-ne) 5"
a=33
while [ $a -gt 0 ]
do
echo $a
a=$(expr $a / 10)
done
exit 0
运行结果为:
2 is less than(-lt) 4
3 is not equal(-ne) 5
33
3
注意,方括号中间的空格必不可少。
变量定义
在变量定义的时候,单引号('')不可用于变量或者指令替换。但是双引号("")可以用于变量或者指令替换:
a='$(expr 1 + 4)'
echo $a
b="$(expr 1 + 4)"
echo $b
echo "$(expr $b + 5)"
echo '$(expr $b + 5)'
运行结果:
$(expr 1 + 4)
5
10
$(expr $b + 5)
我们可以看到,单引号中间的值,全部都是字符本身的组合。而双引号之间的值,会发生变量替换和指令替换。
/dev/null
这是一个为null的device。它的特性为:
- 当写入时,丢弃写入的值
- 当读出时,只返回
EOF
常用的用法就是将stdout redirect 给/dev/null,也就是不打印输出到显示设备的值。我们经常见到的用法是ls > /dev/null 2>&1。这是什么意思呢?
> /dev/null等价于1>/dev/null。也就是ls的stdoutredirect给/dev/null。补充一下,0 is stdin, 1 is stdout, 2 is stderr。- 随后,我们将
2>& 1,这个意思是说,如果有任何error,就redirect给stdout,此时为/dev/null。 - 所以连起来就是,指令的
stdout不打印,同时因为stderrredirect给stdout了,stderr也不打印。
我们能不能将两者反过来用?比如,在如下图中,

ls test1/ goodgood/ 2>&1 1>/dev/nullls test1/ goodgood/ >/dev/null 2>&1
有什么区别呢?区别如下:
- 打印错误信息,但是不打印
stdout。原因是,首先把2>&1,即stderr >& stdout把error信息打印到显示器。其次,再执行1>/dev/null,把stdout > /dev/null,即把剩下的输出打印到显示设备。因此,错误信息仍然会打印出来,而正常输出就不再打印。 - 什么都不打印。首先,
1>/dev/null,即stdout > /dev/null,打印的任何值都丢弃。其次,stderr>& stdout,将error导入输出设备。但是因为此时输出已经redirect到/dev/null了,因此不会有任何错误打印到显示器。
本文深入探讨Shell中的指令替换、条件判定及变量定义技巧,解析$()与``的作用,演示如何利用[空格+条件+空格]进行条件判断,并详解单引号与双引号在变量定义中的差异。此外,还介绍了/dev/null设备的功能及其在重定向中的应用。
295

被折叠的 条评论
为什么被折叠?



