请考虑以下带输出的命令:
$ 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
请帮助我解决我的错误。我知道这是关于引用的。
答案 0 :(得分:2)
du --exclude='aa bb' --exclude='cc dd'
您有多个参数,其中至少有一些包含空格。 没有办法将它们放在一个字符串变量中,以便保留参数之间的分隔。
如果你这样做
args="--exclude=aa bb --exclude=cc dd"
du $args
字符串在所有空格上分开,为du
提供四个不同的参数:
--exclude=aa
,bb
,--exclude=cc
和dd
。
另一方面,用
du "$args"
args
的内容根本没有拆分,所以du
会得到一个参数。
引用没有帮助,因为它们在扩展变量后没有得到处理,但它们按字面意思转到命令,正如您从du
给出的错误中看到的那样。
正确的解决方案是使用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[@]}"
另请参阅:unix.SE上的Why does my shell script choke on whitespace or other special characters?
答案 1 :(得分:1)
如果您在脚本中使用,请将变量放在引号中:
du -sm "$path" "$exc"
同时将作业更改为exc
至
exc="--exclude=aa bb"
另一个选择是更改Internal Field Separator。只需将其设置为换行字符(记住在完成后恢复其原始值):
OLDIFS="$IFS"
IFS="
"
# do your scripting stuff
# restore IFS
IFS="$OLDIFS"
编辑:如果您使用多个--exclude
,则无效。