我想知道以下两个命令之间的区别是什么?
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)
答案 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
。