什么时候应该使用 $( ) 定义变量

什么时候应该使用 $( ) 定义变量

我遇到的一些 shell 脚本在定义变量时使用以下语法:

file_list_1=$(echo "list.txt")

或者

file_list_2=$(find ./)

我会用:

file_list_1="list.txt"

file_list_2=`find ./`

我不确定以上哪一个更好或更安全。x=$( )设置变量时使用语法有什么好处?

答案1

从手册(man bash):

$(命令)  或者  `命令`

Bash 通过执行来执行扩展命令并将命令替换替换为命令的标准输出,并删除所有尾随换行符。嵌入的换行符不会被删除,但它们可能会在分词过程中被删除。命令替换$(cat 文件)可以用同等但更快的替代品$(< 文件)

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着$`\。前面没有反斜杠的第一个反引号终止命令替换。当使用$(命令)形式,括号内的所有字符组成命令;没有一个受到特殊对待。

POSIX 标准定义了$()命令替换的形式。$() 允许嵌套命令并且看起来更好(易读性)。它应该适用于所有伯恩炮弹

您可以阅读有关 IEEE Std 1003.1、Shell 命令语言、2.6.3 命令替换

至少有一个 Unix(AIX)记录了这一点反引号已过时。从该链接:

尽管 ksh 接受反引号语法,但 X/Open 可移植性指南第 4 版和 POSIX 标准认为它已过时。这些标准建议可移植应用程序使用 $(command) 语法。

但是,/bin/sh不必符合 POSIX 标准。因此,正如 @Jeight 指出的那样,在现实世界中有时仍然存在反引号的情况。

答案2

这有很多个人喜好。使用反引号来表示命令将与旧系统更加 POSIX 兼容。 $() 更现代,对于某些人来说更容易阅读。我个人永远不会使用file_list_1=$(echo "list.txt").看起来很丑而且没有什么额外的用处。

相关内容