Unix Shell - 理解变量括号的使用

jon*_*lam 3 unix variables bash shell parentheses

我是 Unix Shell 脚本的新手,我对在什么情况下必须使用这些类型的括号感到困惑。假设这abc是一个由字符串组成的变量。有人可以举例说明如何使用这些括号以及何时应该使用它们吗?

abc $abc ${abc} $(abc) ($abc)

And*_*ite 7

这相当粗糙,但应该是一个好的开始:

abc - 可以是变量名的裸字\字符串: abc=123

$abc - 引用名为 abc 的变量

${abc} - 字符串安全变量引用 file_${abc}_name.txt

$(abc)- 运行命令abc并使用它的标准输出代替$(abc)

($abc)- 运行存储$abc在子shell中的命令

假设您在 bash 中阅读有关变量命令替换参数替换的文档


sas*_*ang 6

$字符用于表示要对后面的术语执行参数扩展。因此,如果外壳读取

abc

它将被解析为一个命令,shell 将尝试执行该命令。

如果外壳看到

$abc

它将parameter expansion对文本执行abc并有效地替换 abc 的值。

${abc}

还将执行参数扩展。当您有这样的表达式时,括号的使用变得很重要:

${abc}_sometext

相对

$abc_sometext

在第一个实例中,shell 将在 上执行参数扩展abc。在第二个实例中,它将执行参数扩展abc_sometext

$(通知执行中括号什么并执行壳command substitution。在这种情况下$不用于parameter expansion。因此,如果外壳读取以下内容:

$(abc)

shell 将执行abc,它的输出将被替换到位,shell 将尝试执行该字符串。

(简单地将命令分组并在子shell中执行它们。所以

(abc)

将执行,abc但与$(abc)它不同的是,无论命令的输出是什么,它都不会尝试执行。例如:

$ $(which ls)
Desktop  Documents  Downloads  Mail  Manjaro  Music  Pictures  Public      Templates  Videos  bin  code  tmp
$ (which ls)
/usr/bin/ls
$ 
Run Code Online (Sandbox Code Playgroud)