在 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)
在执行任何命令行之前,shell 会对其进行解析。
换句话说,${a:-DEFAULT}在a=UPDATED被赋值之前被评估。
(另请注意分配的这种重新表达如何避免无用的使用echo。)
Bash 参考手册的第 3.5 章详细说明了命令行的解析顺序。您会注意到参数扩展接近开头,在波浪号和大括号扩展之后。
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |