如何防止参数膨胀?

如何防止参数膨胀?

如何防止参数膨胀?做Bash 手册在某处提到这个?如果您能帮助我找到其中提到的位置,我将不胜感激。

例如,

$ b=1
$ echo $b
1

当 bash 解释器解释时echo $b,参数扩展$b发生在运行之前echo $b。因此不需要创建bshell 进程的环境变量,以便传递给子进程echo $b

为了进行比较,请考虑另一个例子https://unix.stackexchange.com/a/261406/674

$ b=1
$ c=$(b=2; echo $b)
$ echo $c
2

在原始 shell 中,当 bash 解释器解释 时c=$(b=2; echo $b),它不会$b使用值进行扩展1

在命令替换的子 shell 中,当 bash 解释器解释 时b=2; echo $b,它会$b使用值 进行扩展2

是什么阻止了原始 shell 中的参数扩展$b,而将参数扩展保留$b到子 shell 中?

引号可以防止参数扩展,例如"$b".但这里参数扩展没有引号。命令替换是否会阻止其中的参数扩展?

答案1

您误会了,双引号"$b"不会阻止参数扩展,它会阻止路径名扩展(又名通配符)领域分裂

如果你想防止参数扩展,你需要使用引用, 喜欢单引号 '$b'或者逃跑 \$b:

$ echo '$b'

或者:

$ echo \$b

然后$b按字面输出。


在该示例中,没有什么可以阻止参数扩展。

当 shell 读取输入时c=$(b=2; echo $b),它会执行令牌识别,看到这$(是命令替换的令牌。因此,它将$(和之间的其余字符串视为)在由命令替换创建的子 shell 中解释,而不是在当前 shell 中解释。

相关内容