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

问题描述 投票:2回答:2

在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
bash
2个回答
4
投票

shell在执行任何命令之前解析命令行。

换句话说,在分配${a:-DEFAULT}之前评估a=UPDATED

(另请注意这种赋值的重新表述如何避免使用useless use of echo。)

Chapter 3.5 of the Bash Reference Manual详细说明了命令行的解析顺序。您会注意到参数扩展接近开头,在波浪和支撑扩展之后。


1
投票

你可以使用:

a=$(echo UPDATED) bash -c 'echo "${a:-DEFAULT}"'

UPDATED

bash -c将分叉一个新的子shell,其内嵌值为a

请注意,除非您在那里进行其他命令替换,否则a=$(echo UPDATED)毫无意义。它可以缩短为:

a='UPDATED' bash -c 'echo "${a:-DEFAULT}"'
© www.soinside.com 2019 - 2024. All rights reserved.