最近看大神以前写的,遗留下来的shell脚本时,发现一个有意思的命令
true ${var:=var1}
当时百思不得解,各种百度,请教朋友,就在刚刚吃完晚饭,大概明白怎么回事儿了,所以记录下来。。
要理解 true ${var:=var1},首先要理解${var:=var1}
${var:=var1}:当var没有声明,或者为空值时,${var:=var1}就等于var1,而且var也会赋值为var1.
所以我们在终端执行时,会出现下面的情况:
zhangsan@ubuntu:~$ echo $var
zhangsan@ubuntu:~$ ${var:=var1}
var1:未找到命令
zhangsan@ubuntu:~$
当我们只想安静的给var赋值时,通常就是tmp=${var:=var1}这种方式,但是这种方式会多一个无用的,我们不想要的变量tmp,当然你如果不是一个强迫症患者也无所谓。
还有一种就是
true ${var:=var1}
这里就要了解true的工作机制,true 的作用就是忽略参数,什么都不执行,然后返回0。man true结果如下。
TRUE(1) User Commands TRUE(1)
NAME
true - do nothing, successfully
SYNOPSIS
true [ignored command line arguments]
true OPTION
DESCRIPTION
Exit with a status code indicating success...
具体的问题是,在我执行true touch ~/test的时候,test文件根本没有创建,这就与我刚开始的认知有冲突了。
为什么true ${var:=var1}就会将var1赋值给var,但是touch ~/test为什么就没执行呢?
首先,还是要明确一下true命令,true command其实是不执行command,这也就是为什么touch ~/test没有生效。那么${var:=var1}会被执行呢?关键其实跟shell命令的执行过程有关系的。
参考:http://www.jb51.net/article/33487.htm
shell的执行流程图如下:

true ${var:=var1}执行时,会按照上面的流程,${var:=var1}在第5步变量替换处执行了。在第10步的时候,true忽略了所有的参数,什么都不做,然后返回。
${var:=var1}的执行,不是true去执行,而是shell的固定流程。所以true ${var:=var1}既会执行${var:=var1},也会忽略${var:=var1}的结果
网友评论