将参数存储到带空格的变量中

时间:2017-04-19 12:00:09

标签: bash variables quotes

请考虑以下带输出的命令:

$ 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

请帮助我解决我的错误。我知道这是关于引用的。

2 个答案:

答案 0 :(得分:2)

du --exclude='aa bb' --exclude='cc dd'

您有多个参数,其中至少有一些包含空格。 没有办法将它们放在一个字符串变量中,以便保留参数之间的分隔。

如果你这样做

args="--exclude=aa bb --exclude=cc dd"
du $args

字符串在所有空格上分开,为du提供四个不同的参数: --exclude=aabb--exclude=ccdd

另一方面,用

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,则无效。