[Shell]部分shell指令用法及/dev/null

指令替换

$()和``是可以用来指令替换的,即指令的值替换$()的部分。比如:

a=`expr 3 + 4`
echo $a 
b=$(expr $a \* 3)
echo $b

结果分别为:721

条件判定

可以用[空格 + 条件 + 空格]的形式来作为条件判断,可用于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。它的特性为:

  1. 当写入时,丢弃写入的值
  2. 当读出时,只返回EOF

常用的用法就是将stdout redirect 给/dev/null,也就是不打印输出到显示设备的值。我们经常见到的用法是ls > /dev/null 2>&1。这是什么意思呢?

  1. > /dev/null等价于1>/dev/null。也就是lsstdout redirect给/dev/null。补充一下,0 is stdin, 1 is stdout, 2 is stderr
  2. 随后,我们将2>& 1,这个意思是说,如果有任何error,就redirect给stdout,此时为/dev/null
  3. 所以连起来就是,指令的stdout不打印,同时因为stderrredirect给stdout了,stderr也不打印。

我们能不能将两者反过来用?比如,在如下图中,

在这里插入图片描述

  1. ls test1/ goodgood/ 2>&1 1>/dev/null
  2. ls test1/ goodgood/ >/dev/null 2>&1

有什么区别呢?区别如下:

  1. 打印错误信息,但是不打印stdout。原因是,首先把2>&1,即stderr >& stdout把error信息打印到显示器。其次,再执行1>/dev/null,把stdout > /dev/null,即把剩下的输出打印到显示设备。因此,错误信息仍然会打印出来,而正常输出就不再打印。
  2. 什么都不打印。首先,1>/dev/null,即stdout > /dev/null,打印的任何值都丢弃。其次,stderr>& stdout,将error导入输出设备。但是因为此时输出已经redirect到/dev/null了,因此不会有任何错误打印到显示器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值