考虑以下带有输出的命令:
$ du -sm ~/Documents
458 /home/utilisateur/Documents
$ du -sm ~/Documents --exclude='aa bb' --exclude='cc dd'
153 /home/utilisateur/Documents
我希望用这样的一个变量替换排除项,以获得相同的输出。
$ du -sm ~/Documents "$c"
但是,如果我用以下方法设置变量,我就失败了。我测试过:
$ c=--exclude='aa bb'\ --exclude='cc dd'
$ du -sm ~/Documents "$c"
458 /home/utilisateur/Documents
$ c="\"--exclude='aa bb' --exclude='cc dd'\""
$ du -sm ~/Documents $c
458 /home/utilisateur/Documents
du: cannot access '"--exclude='\''aa': No such file or directory
du: cannot access 'bb'\''': No such file or directory
du: cannot access 'dd'\''"': No such file or directory
$ c="--exclude='aa bb' --exclude='cc dd'"
$ du -sm ~/Documents "$c"
458 /home/utilisateur/Documents
$ du -sm ~/Documents $c
458 /home/utilisateur/Documents
du: cannot access 'bb'\''': No such file or directory
du: cannot access 'dd'\''': No such file or directory
请帮助我纠正我的错误。我知道这是关于报价的。
du --exclude='aa bb' --exclude='cc dd'
您有多个参数,至少其中一些包含空格。
无法将它们放入单个字符串变量中以便保留参数之间的分隔。
如果你这样做
args="--exclude=aa bb --exclude=cc dd"
du $args
该字符串在所有空格上分割,给出四个不同的参数du
:
--exclude=aa
, bb
, --exclude=cc
and dd
.
另一方面,与
du "$args"
的内容args
根本没有分裂,所以du
得到一个参数。
引号没有帮助,因为它们在扩展变量后不会被处理,但它们会按字面意思转到命令,正如您从错误中看到的那样du
gave.
正确的解决方案是使用an array:
args=("--exclude=aa bb" "--exclude=cc dd") # initialize it
args+=("--exclude=ee ff") # you can even append to it
du -sm ~/Documents "${args[@]}"
也可以看看:为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?在unix.SE上
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)