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

bas*_*sos 3 bash

在 bash shell 中,我尝试了以下 2 个产生不同效果的命令:

$ a=`echo UPDATED` echo ${a:-DEFAULT}
DEFAULT

$ a=`echo UPDATED`; echo ${a:-DEFAULT}
UPDATED
Run Code Online (Sandbox Code Playgroud)

无法在一个命令中获得结果(第一种情况)?如果不是,为什么?

引用该男子的一些话:

一个简单的命令是一系列可选的变量赋值,后跟空格分隔的单词和重定向,并由控制运算符终止。

拆分成单词后在命令行上进行扩展。

为清楚起见,实际情况涉及提供由事件处理程序执行的二进制文件。二进制路径来自配置文件,如果配置文件中未定义,则回退到默认值。

更接近真实情况的是这个片段,它被事件处理程序调用:

a=`getConfigVariable "myExec"` ${a:-/opt/bin/default}
Run Code Online (Sandbox Code Playgroud)

其中 getConfigVariable "myExec" 返回配置变量 "myExec",如果未定义,则返回空字符串。例如:

$ getConfigVariable "myExec"
/opt/bin/updated
Run Code Online (Sandbox Code Playgroud)

tri*_*eee 5

在执行任何命令行之前,shell 会对其进行解析。

换句话说,${a:-DEFAULT}a=UPDATED被赋值之前被评估。

(另请注意分配的这种重新表达如何避免无用的使用echo。)

Bash 参考手册的第 3.5 章详细说明了命令行的解析顺序。您会注意到参数扩展接近开头,在波浪号和大括号扩展之后。