Contents

${}和$()在bash中的区别

1. 概述

在本教程中,我们将讨论Bash 中*${}$()*之间的区别。首先,我们将简要回顾一下命令替换参数扩展 在 Bash 中是如何工作的。然后,我们将深入探讨两者之间的差异并讨论一些用例。

2. 命令替换

Bash 中的命令替换允许我们执行命令并将其替换为其标准输出。请注意,此命令在 subshel​​l 中执行,这意味着它有自己的环境,因此不会影响父 shell 的环境。

现在让我们检查一种实现命令替换的方法:

$ var_date=$(date) && echo $var_date
Sat May  1 11:33:36 IST 2021

在这种情况下,我们使用 $(..) 形式,其中要执行的命令包含在括号之间。这种形式是命令替换的推荐语法

3. 大括号参数扩展

让我们运行几个示例来了解参数扩展的工作原理:

$ price=5
$ echo "$priceUSD"
$ echo "${price}USD"
5USD

从输出中可以看出,我们在这里使用{..}作为分隔标记的消歧机制

在变量周围添加双引号会告诉 Bash 将其视为一个单词。因此,第一个echo语句返回一个空输出,因为未定义变量priceUSD

但是,使用${price}我们能够解决歧义。显然,在第二个echo语句中,我们可以将字符串USD与我们想要做的price变量的值连接起来。

大括号扩展的另一个有趣用途是生成任意字符串

$ mkdir /home/shubh/blogdemo/{linux,cs,java}
$ ls -lrt /home/shubh/blogdemo/
total 0
drwxr-xr-x 1 shubh shubh 512 Mar 28 15:24 linux
drwxr-xr-x 1 shubh shubh 512 Mar 28 15:24 cs
drwxr-xr-x 1 shubh shubh 512 Mar 28 15:24 java

请注意我们如何使用大括号扩展轻松地一次创建多个目录。

4. 差异

正如我们在前几节中看到的,当我们想要捕获写入stdout的命令结果时,我们应该使用*$()*。在这种情况下,将在新的子 shell 中执行的命令必须在括号内指定。

另一方面,使用大括号参数扩展,我们可以在*{}*中指定一个变量来保护它不被扩展。当紧随其后的字符可以解释为变量名的一部分时,这很有用。

现在让我们用一个例子来验证这些概念:

$ due_date="01-01"
$ echo "Status as of $(date +%m-%d-%Y) : The delivery is due on ${due_date}-2022"
Status as of 05-01-2021 : The delivery is due on 01-01-2022

在这个例子中,我们使用*${}形式,即大括号展开,来打印due_date变量的值。此外,我们使用命令替换$()*  来执行date 命令打印当前日期。