我遇到的一些 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")
.看起来很丑而且没有什么额外的用处。