Bash Unix Shell-了解变量的括号用法

Bash Unix Shell-了解变量的括号用法,bash,shell,variables,unix,parentheses,Bash,Shell,Variables,Unix,Parentheses,我不熟悉unixshell脚本,我有点困惑在什么情况下必须使用这些类型的括号。 假设abc是一个由字符串组成的变量。有人能给我举个例子说明如何使用这些括号,以及我应该在什么时候使用它们吗 abc $abc ${abc} $(abc) ($abc)这相当粗糙,但应该是一个良好的开端: abc-可以是变量名的裸字\字符串:abc=123 $abc-对名为abc的变量的引用 ${abc}-字符串安全变量引用文件${abc}\u name.txt $(abc)-运行命令abc,并使用它的stdout代替

我不熟悉unixshell脚本,我有点困惑在什么情况下必须使用这些类型的括号。 假设
abc
是一个由字符串组成的变量。有人能给我举个例子说明如何使用这些括号,以及我应该在什么时候使用它们吗

abc
$abc
${abc}
$(abc)

($abc)

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

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

$abc
-对名为abc的变量的引用

${abc}
-字符串安全变量引用
文件${abc}\u name.txt

$(abc)
-运行命令
abc
,并使用它的stdout代替
$(abc)

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


假设您处于bash read and.

中,
$
字符用于表示将对以下术语执行参数扩展。因此,如果shell读取

abc

它将被解析为命令,shell将尝试并执行该命令

如果贝壳看到

$abc

它将对文本
abc
执行
参数扩展
,并有效地替换abc的值

${abc}

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

${abc}\u sometext

$abc\u sometext

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

$(
告诉shell执行大括号中的内容并执行
命令替换
。在此上下文中,
$
不用于
参数扩展
。因此,如果shell读取以下内容:

$(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
$ 

看看这个:你错过了一些:
($abc))
$($abc))
$($abc))
可能有一些意义,但很少有用。试试看:
abc=1+1;($abc));($abc));echo$($abc));echo$($abc))
($abc>
($abc)
--在子shell中,在标准通道上运行变量
abc
.IO中存储的命令。我不知道“字符串安全”是什么意思--大括号用于消除变量与以下文本“_name”@glennjackman hmm”之间的歧义,实际上我遇到了语法错误…
hi='echo hi';echo($hi)
@glennjackman我的意思是安全,因为“file_$abc_name.txt”将尝试查找名为
$abc_name
的变量,而不是
$abc
@AndrewWhite:
($abc)
取决于上下文。
arr=($abc)
是数组赋值。
($abc)
仅当
是命令中的第一个单词时才是复合命令(就像
{$abc;}
一样,大括号需要更多标点符号,因为它们不是自定界字符。)