Bash 用空格将参数存储到变量中

Bash 用空格将参数存储到变量中,bash,variables,quotes,Bash,Variables,Quotes,考虑以下带有输出的命令: $ du -sm ~/Documents 458 /home/utilisateur/Documents $ du -sm ~/Documents --exclude='aa bb' --exclude='cc dd' 153 /home/utilisateur/Documents 我希望用一个这样的变量替换excludes,以获得相同的输出 $ du -sm ~/Documents "$c" 但是,如果我用following设置变量,我就失败了。我测试了: $

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

$ du -sm ~/Documents 
458 /home/utilisateur/Documents
$ du -sm ~/Documents --exclude='aa bb' --exclude='cc dd'
153 /home/utilisateur/Documents
我希望用一个这样的变量替换excludes,以获得相同的输出

$ du -sm ~/Documents "$c"
但是,如果我用following设置变量,我就失败了。我测试了:

$ 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" 
另一个选择是更改。只需像这样将其设置为换行符(记住在完成后恢复其原始值):

编辑:如果使用多个
--排除
,则此操作无效

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
中看到的那样

正确的解决方案是使用:


另请参见:在unix.SE上,我更新了我的问题,因为有几个
--排除了
需要和相同的问题。你能帮我吗?如果你想把引号传给命令,引用引号是有效的。通常你不会。另外,我不知道改变
IFS
在这里有什么帮助?@ilkkachu我的答案是为了一个脚本(我真的没有提到,所以是我的错),因此改变
IFS
。同样在我回答之后,OP将他的问题改为包含两个
--exclude
语句,然后它停止了工作。你的答案非常有用,所以+1:)所以,数组是关键!另外,
args=(-exclude='aabb'-exclude='ccdd')
也可以工作。谢谢ikkachu@NicolasSmith,是的,
-a=“foo-bar”
“-a=foo-bar”
-a=foo\bar
完全相同。注意,只要空格被引用,其余的是否被引用并不重要,因为没有任何其他特殊字符。从shell的角度来看,等号并不特殊
du "$args"
args=("--exclude=aa bb" "--exclude=cc dd")   # initialize it
args+=("--exclude=ee ff")                    # you can even append to it
du -sm ~/Documents "${args[@]}"