在 shell 中的变量插值

185

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

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

在我的shell脚本中,我尝试像这样做(反引号是有意义的)

`tail -1 $filepath_newstap.sh`

这条命令失败了,因为变量没被叫做$filepath_newstap.sh

我该如何将_newstap.sh附加到变量名上?

请注意反引号是用于表达式求值的。

3个回答

296

使用

"$filepath"_newstap.sh
或者
${filepath}_newstap.sh
或者
$filepath\_newstap.sh

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

您可以使用set -u使shell在引用未定义变量时退出并显示错误信息。


9
也许还应该提到 set -u,如果您引用了未定义的变量,它会导致脚本中止。 - tripleee
2
${}和双引号之间有什么区别?我应该更喜欢哪一个? - user31389
4
当变量包含空格时,只有双引号才能起作用,这是它们的区别。 - choroba
@choroba 是变量_name_还是变量_value_? - Joshua Pinter
1
@JoshuaPinter:变量名中不能包含空格。 - choroba
你还可以像这样对一个变量进行抽查,如果为空则中断:"${check_me:?}" - Ajax

26

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

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

1
你不需要双引号吗? - michaelsnowden
@michaelsnowden 这并没有告诉我任何我不知道的信息。你为什么认为需要使用双引号? - user539810
因为您正在尝试进行字符串插值,而这需要双引号。 - michaelsnowden
@michaelsnowden 参数扩展要么在双引号内进行,要么完全不用引号。单引号或使用引号或其他标识符中无效的分隔字符是防止参数扩展的唯一方法。例如,"$filepath"_foo${filepath}_foo都会扩展为/tmp/name_foo。然而,'$filepath'_foo"$"filepath_foo$"filepath"_foo都可以完全避免扩展。这就是为什么export PATH=$PATH:$addpath的操作能将:$addpath(可能会受到参数扩展的影响)添加到PATH环境变量中的原因。 - user539810
顺便提一下,另外两个答案都包含相同的回复。然而,被采纳的答案还提供了替代方案和对OP所描述行为的解释。 - user539810
显示剩余2条评论

4

在Bash中:

tail -1 ${filepath}_newstap.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接