了解在bash中使用命令替换

时间:2014-10-03 13:14:21

标签: bash

我想知道以下两个命令之间的区别是什么?

ubuntu:~/bin$ (ls -A1 /home/ | wc -l) 
1

ubuntu:~/bin$ $(ls -A1 /home/ | wc -l)
1: command not found

如果我将dir_count=(ls -A1 /home/ | wc -l)放入脚本中,则会出现以下错误。

./two_args: line 24: syntax error near unexpected token `|'
./two_args: line 24: `dir_1_count=(ls -A1 "$dir_1" | wc -l)'

以下作品如下:

 dir_count=$(ls -A1 /home/ | wc -l)

3 个答案:

答案 0 :(得分:1)

$(command),是command substitution。它只是执行命令并替换命令的标准输出。

因此,如果您想设置变量,只需:dir_count=$(ls -A1 /home/ | wc -l)

关于代码的其余部分:

(ls -A1 /home/ | wc -l)

这个在子shell中执行命令。你可能不想要那些括号。

$(ls -A1 /home/ | wc -l)

这个只是没有任何意义,你替换结果,所以得到1,shell将尝试执行名为1的命令。

答案 1 :(得分:0)

为了简化脚本中的变量管理,我建议您尝试以下操作:

dir_1_count=`ls -A1 ${dir1} | wc -l`

使用字符"`"分隔变量并将通常的shell命令的结果存储在脚本中。

请记住使用倒数撇号,而不是单引号,复制我刚给你的变量定义。

答案 2 :(得分:0)

(...)只是一个特殊的分组运算符。它在子shell中运行...,这意味着它无法修改父级的执行环境(因此,例如,(foo=bar)是无用的,因为赋值将不会超过命令的结尾),但是否则处理得很正常(标准输出到标准输出等)。


$(...)是替代品;就像$foo如何被变量foo的值替换一样,$(...)将被命令...的输出替换。更确切地说 。 。 。与(...)一样,它也在子shell中运行...,但此外,它还会捕获...的标准输出,然后最终被该输出替换。所以,例如,这个:

"$(echo cd)" "foo$(echo bar)"

运行echo cd并捕获cd,然后运行echo bar并捕获bar,然后运行组合命令cd foobar