我试图在 bash(GNU bash,版本 5.0.17)中将 date 命令的输出大写。
date +"%d%m%Y"
# 30Dec2020
Run Code Online (Sandbox Code Playgroud)
我遇到了大写的 ^^ 运算符,它用作
DT="$(date +"%d%b%Y")"
echo ${DT^^} # works with curly braces
# 30DEC2020
echo $(DT^^) # fails with brackets
bash: DT^^: command not found
Run Code Online (Sandbox Code Playgroud)
我不熟悉 ${} 这与 $() 有什么不同。我确实在网上查了一下,他们似乎都做了同样的事情。变量扩展。提前致谢。
带美元符号 ( ${}) 的花括号用于预先建立的变量。看一下下面的例子:
ThisIsAVariable=abc
echo ${ThisIsAVariable}
echo $ThisIsAVariable
Run Code Online (Sandbox Code Playgroud)
最后的命令将打印相同的内容:abc。然而,在某些情况下,能够将变量括在花括号中非常有用。例如,如果脚本有两个相邻的变量,则花括号有助于将一个变量与另一个变量清晰地分开。例如:
echo ${ThisIsAVariable}${PWD}
Run Code Online (Sandbox Code Playgroud)
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]}
Run Code Online (Sandbox Code Playgroud)
前三个命令不会有任何输出,因为它们只是设置变量。但是,第四个命令将打印1.txt。调用该变量时没有显式告诉 shell 要打印哪个数组,因此它默认为 #0。第五行是最有趣的,因为它将打印3.txt。我所做的就是file用数组 #2 调用变量,正如我们所看到的,该变量被声明为3.txt.
您还可以使用大括号做其他事情:
x=123-45
echo ${x//-*}
echo $x
Run Code Online (Sandbox Code Playgroud)
倒数第二个命令基本上翻译为“删除连字符后的所有内容”。因此,虽然 x 仍然等于字符串123-45,但-45已被过滤掉。最后一个命令的输出123-45正如我们所期望的那样。
关于大括号扩展还有很多东西需要学习,但是……好吧……我还没有学过,所以我什至无法开始教授它。
也就是说,带有美元符号 ( $())的括号代表command substitution,这是完全不同的。基本上,进程替换是让一个命令生成另一个命令的参数。看一下这个例子:
ls
ls -l
ls $(echo -l)
Run Code Online (Sandbox Code Playgroud)
您会再次注意到最后两个命令具有相同的输出。这是因为,在最后一行echo给出了ls一个-l参数,使其与上面的命令本质上相同。有时,您只需要一个程序的输出成为另一个程序的输入,以便自动化某项或另一项操作。这可能很棘手,但幸运的是,像 BASH 这样的 *nix shell 为您提供了很多方法来实现这一点。(我不会提及它们,因为它们超出了这个问题的范围,但如果你愿意找到地方学习,你很快就会成为全能巫师。这很有趣。)