外壳中的变量插值


103

我有一个名为的变量filepath=/tmp/name

要访问该变量,我知道我可以这样做: $filepath

在我的shell脚本中,我试图做这样的事情(需要使用反引号)

`tail -1 $filepath_newstap.sh`

这行失败,duuh !,因为未调用该变量 $filepath_newstap.sh

如何追加_newstap.sh到变量名?

请注意,反引号用于表达式评估。

Answers:


186

"$filepath"_newstap.sh

要么

${filepath}_newstap.sh

要么

$filepath\_newstap.sh

_是标识符中的有效字符。点不是,因此shell尝试进行插值$filepath_newstap

您可以使用set -u,使外壳的出口与一个错误,当你引用一个未定义的变量。


7
也许还提到set -u如果引用未定义的变量,它将导致脚本中止。
Tripleee

1
使用${}双引号和双引号有什么区别?我应该优先选择另一个吗?
user31389'3

3
@ user31389:区别在于变量包含空格时,只有双引号起作用。
choroba

@choroba变量还是变量
约书亚·品特

15

在变量名周围使用花括号:

`tail -1 ${filepath}_newstap.sh`

1
您不需要双引号吗?
michaelsnowden

@michaelsnowden不一定。为安全起见,是的,但是问题明确指出了一个没有空格的路径,并进一步表明该问题$filepath_newstap.sh被解释为解决问题的方法,${filepath_newstap}.sh而不是预期${filepath}_newstap.sh的问题。

@michaelsnowden这告诉我我还没有意识到的任何事情。您为什么认为需要双引号?

因为您正在尝试进行字符串插值,并且您需要为此使用双引号
michaelsnowden

@michaelsnowden参数扩展在双引号中或完全在引号之外进行。单引号或带引号的分隔符或其他在标识符中无效的字符是防止参数扩展的唯一方法。例如,"$filepath"_foo${filepath}_foo都将扩展为/tmp/name_foo。然而'$filepath'_foo"$"filepath_foo$"filepath"_foo都会避免扩张完全。这就是为什么要向环境变量export PATH=$PATH:$addpath添加:$addpath(可能会进行参数扩展)的原因PATH

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.