在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
答案 0 :(得分:4)
shell在执行任何命令之前解析命令行。
换句话说,在${a:-DEFAULT}
被分配之前评估a=UPDATED
。
(还要注意这种赋值的重新规划如何避免useless use of echo
。)
Chapter 3.5 of the Bash Reference Manual详细说明了命令行的解析顺序。您会注意到参数扩展接近开头,在波浪和支撑扩展之后。
答案 1 :(得分:1)
您可以使用:
a=$(echo UPDATED) bash -c 'echo "${a:-DEFAULT}"'
UPDATED
bash -c
将分叉一个内联值为a
的新子shell。
请注意a=$(echo UPDATED)
没有意义,除非您在那里有其他命令替换。它可以缩写为:
a='UPDATED' bash -c 'echo "${a:-DEFAULT}"'