在同一命令上组合bash变量和参数扩展

时间:2017-12-15 10:56:00

标签: bash

在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

2 个答案:

答案 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}"'