Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解bash中命令替换的使用_Bash - Fatal编程技术网

了解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)
。不管是脚本还是控制台。谢谢你的提示,但这并不能回答我的问题。我试试你的方法。但是仍然在寻找答案。这是老式的命令替换,不推荐使用(这没有错,但灵活性较低,更难用人眼解析)