命令替换中大括号和中括号的区别 - ${} 和 $()

命令替换中大括号和中括号的区别 - ${} 和 $()

我试图在 bash(GNU bash,版本 5.0.17)中将 date 命令的输出大写。

date +"%d%m%Y"
# 30Dec2020

我遇到了大写的 ^^ 运算符,它用作

DT="$(date +"%d%b%Y")"
echo ${DT^^} # works with curly braces
# 30DEC2020

echo $(DT^^) # fails with brackets
bash: DT^^: command not found

我不熟悉 ${} 这与 $() 有什么不同。我确实在网上查了一下,他们似乎都做了同样的事情。变量扩展。提前致谢。

答案1

带美元符号 ( ${}) 的花括号用于预先建立的变量。看一下下面的例子:

ThisIsAVariable=abc
echo ${ThisIsAVariable}
echo $ThisIsAVariable

最后的命令将打印相同的内容:abc。然而,在某些情况下,能够将变量括在花括号中非常有用。例如,如果脚本有两个相邻的变量,则花括号有助于将一个变量与另一个变量清晰地分开。例如:

echo ${ThisIsAVariable}${PWD}

shell 和任何阅读此脚本的人都可以轻松看出“ThisIsAVariable”和“PWD”是两个不同的变量。

大括号也很重要,因为它们是处理变量数组的唯一方法。假设我们位于一个包含以下文件1.txt2.txt和的目录中3.txt。考虑到这一点,请考虑以下事项:

file[0]=1.txt
file[1]=2.txt
file[2]=3.txt
echo $file
echo ${file[2]}

前三个命令不会有任何输出,因为它们只是设置变量。但是,第四个命令将打印1.txt。调用该变量时没有显式告诉 shell 要打印哪个数组,因此它默认为 #0。第五行是最有趣的,因为它将打印3.txt。我所做的就是file用数组 #2 调用变量,正如我们所看到的,该变量被声明为3.txt.

您还可以使用大括号做其他事情:

x=123-45
echo ${x//-*}
echo $x

倒数第二个命令基本上翻译为“删除连字符后的所有内容”。因此,虽然 x 仍然等于字符串123-45,但-45已被过滤掉。最后一个命令的输出123-45正如我们所期望的那样。

关于大括号扩展还有很多东西需要学习,但是……好吧……我还没有学过,所以我什至无法开始教授它。

也就是说,带有美元符号 ( $()) 的括号代表command substitution,这是完全不同的。基本上,进程替换是让一个命令生成另一个命令的参数。看一下这个例子:

ls
ls -l
ls $(echo -l)

您会再次注意到最后两个命令具有相同的输出。这是因为,在最后一行echo给出了ls一个-l参数,使其与上面的命令本质上相同。有时候,你只是需要一个程序的输出成为另一个程序的输入,以便使某件事或另一件事自动化。这可能很棘手,但幸运的是,像 BASH 这样的 *nix shell 可以为您提供足够实现这一目标的方法。 (我不会提及它们,因为它们超出了这个问题的范围,但如果你愿意找地方学习,你就会成为全能向导立刻。这很有趣。)

相关内容