在bash shell中,我尝试了以下2个命令,产生不同的效果:
$ a=`echo UPDATED` echo ${a:-DEFAULT}
DEFAULT
$ a=`echo UPDATED`; echo ${a:-DEFAULT}
UPDATED
是不是可以在一个命令中实现结果(第一种情况)?如果没有,为什么?
该男子的一些引言:
一个简单的命令是一系列可选的变量赋值,后跟空格分隔的单词和重定向,并由控制操作符终止。
在将命令行拆分为单词后,将在命令行上执行扩展。
为清楚起见,真实案例涉及提供由事件处理程序执行的二进制文件。二进制路径从配置文件获取,如果未在配置文件中定义,则回退到默认值。
更接近真实案例的是这个片段,由事件处理程序调用:
a=`getConfigVariable "myExec"` ${a:-/opt/bin/default}
其中getConfigVariable“myExec”返回配置变量“myExec”,如果未定义则返回空字符串。例如:
$ getConfigVariable "myExec"
/opt/bin/updated
shell在执行任何命令之前解析命令行。
换句话说,在分配${a:-DEFAULT}
之前评估a=UPDATED
。
(另请注意这种赋值的重新表述如何避免使用useless use of echo
。)
Chapter 3.5 of the Bash Reference Manual详细说明了命令行的解析顺序。您会注意到参数扩展接近开头,在波浪和支撑扩展之后。
你可以使用:
a=$(echo UPDATED) bash -c 'echo "${a:-DEFAULT}"'
UPDATED
bash -c
将分叉一个新的子shell,其内嵌值为a
。
请注意,除非您在那里进行其他命令替换,否则a=$(echo UPDATED)
毫无意义。它可以缩短为:
a='UPDATED' bash -c 'echo "${a:-DEFAULT}"'