指令替换
$()
和``是可以用来指令替换的,即指令的值替换$()
的部分。比如:
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
的stdout
redirect给/dev/null
。补充一下,0 is stdin, 1 is stdout, 2 is stderr
。- 随后,我们将
2>& 1
,这个意思是说,如果有任何error,就redirect给stdout
,此时为/dev/null
。 - 所以连起来就是,指令的
stdout
不打印,同时因为stderr
redirect给stdout
了,stderr
也不打印。
我们能不能将两者反过来用?比如,在如下图中,
ls test1/ goodgood/ 2>&1 1>/dev/null
ls 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
了,因此不会有任何错误打印到显示器。