使用 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=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[@]}"
另请参阅:Why does my shell script choke on whitespace or other special characters? unix.SE
考虑以下带有输出的命令:
$ 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=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[@]}"
另请参阅:Why does my shell script choke on whitespace or other special characters? unix.SE