[英]Combine bash variable and parameter expansion on same command
在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=UPDATED
之前先评估${a:-DEFAULT}
。
(还要注意,这种重新分配的方式如何避免了echo
的无用使用 。)
《 Bash参考手册》的第3.5章详细介绍了命令行的解析顺序。 您会注意到,在波浪号和大括号扩展之后,参数扩展已接近开始。
您可以使用:
a=$(echo UPDATED) bash -c 'echo "${a:-DEFAULT}"'
UPDATED
bash -c
将fork一个新的子外壳,具有内嵌价值a
可用。
请注意,除非在那里有其他命令替换,否则a=$(echo UPDATED)
是没有意义的。 可以缩短为:
a='UPDATED' bash -c 'echo "${a:-DEFAULT}"'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.