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[@]}"