使用 space 将参数存储到变量中

Store parameter into variable with space

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

$ 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 -sm "$path" "$exc"

也将 exc 的分配更改为

exc="--exclude=aa bb" 

另一种选择是更改Internal Field Separator。像这样设置为换行符即可(完成后记得恢复原来的值):

OLDIFS="$IFS"
IFS="
"
# do your scripting stuff
# restore IFS
IFS="$OLDIFS"

编辑:如果您使用多个 --exclude.

,这将不起作用
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[@]}"

另请参阅:Why does my shell script choke on whitespace or other special characters? unix.SE