了解bash中命令替换的使用
我想知道下面两个命令之间的区别是什么了解bash中命令替换的使用,bash,Bash,我想知道下面两个命令之间的区别是什么 ubuntu:~/bin$ (ls -A1 /home/ | wc -l) 1 ubuntu:~/bin$ $(ls -A1 /home/ | wc -l) 1: command not found 如果我把dir\u count=(ls-A1/home/| wc-l)放在脚本中,我会得到以下错误 ./two_args: line 24: syntax error near unexpected token `|' ./two_args: line 2
ubuntu:~/bin$ (ls -A1 /home/ | wc -l)
1
ubuntu:~/bin$ $(ls -A1 /home/ | wc -l)
1: command not found
如果我把dir\u 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)
为了简化脚本中的变量管理,我建议您尝试以下操作:
dir_1_count=`ls -A1 ${dir1} | wc -l`
使用字符“`”分隔变量,并在脚本中存储常用shell命令的结果
记住使用倒撇号,而不是单引号,复制我刚才给你的变量定义。$(command)
,是。它只是执行命令并替换命令的标准输出
因此,如果要设置变量,只需:dir\u count=$(ls-A1/home/| wc-l)
关于代码的其余部分:
(ls -A1 /home/ | wc -l)
这一个在子shell中执行命令。你可能不想要那些括号
$(ls -A1 /home/ | wc -l)
这个没有任何意义,您替换结果,得到1
,shell将尝试执行名为1
(…)
的命令,它只是一个特殊的分组运算符。它在子shell中运行,…
,这意味着它无法修改父级的执行环境(因此,例如,(foo=bar)
是无用的,因为赋值在命令结束后将不会继续存在),但在其他情况下会被非常正常地处理(它的标准输出变为标准输出,等等)
$(…)
是一种替代;就像将$foo
替换为变量foo
的值一样,$(…)
将替换为命令..
的输出。更准确地说。与(…)
类似,它也在子shell中运行..
,但除此之外,它捕获..
的标准输出,然后用该输出替换。例如,这个:
"$(echo cd)" "foo$(echo bar)"
运行
echo cd
并捕获cd
,运行echo bar
并捕获bar
,然后运行组合命令cd foobar
使用var=$(命令)
定义变量。因此,您必须使用dir_count=$(ls-A1/home/| wc-l)
。不管是脚本还是控制台。谢谢你的提示,但这并不能回答我的问题。我试试你的方法。但是仍然在寻找答案。这是老式的命令替换,不推荐使用(这没有错,但灵活性较低,更难用人眼解析)