我试图在 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.txt
、2.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 可以为您提供足够实现这一目标的方法。 (我不会提及它们,因为它们超出了这个问题的范围,但如果你愿意找地方学习,你就会成为全能向导立刻。这很有趣。)