繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM