【发布时间】:2020-04-06 10:07:19
【问题描述】:
我查看了有关此问题的类似帖子,但无法弄清楚如何使执行的代码采用正确的格式,该格式需要为foo --bar "a='b'"。我最好的尝试是
#!/bin/bash -x
bar='--bar ''"''a='"'"'b'"'"'"'
cmd=(foo $bar)
echo ${cmd[@]}
eval ${cmd[@]}
echo 的输出是正确的,但 eval 的输出不正确
+ bar='--bar "a='\''b'\''"'
+ cmd=(foo $bar)
+ echo foo --bar '"a='\''b'\''"'
foo --bar "a='b'"
+ eval foo --bar '"a='\''b'\''"'
++ foo --bar 'a='\''b'\'''
使用选项执行命令的正确方法是什么?
【问题讨论】:
-
cmd=(foo "$bar"),确定吗? (除非你有充分的理由不引用变量扩展。) -
不要将复杂的参数列表存储为纯字符串,使用数组:
bar=(--bar "a='b'");foo "${bar[@]}"。并避免eval,这是一个巨大的脚炮。见this question -
BashFAQ #50 作为一个整体是相关的。
-
顺便说一句,注意
--bar "a='b'"通常是错误的——大多数命令都像--bar a='b'一样使用,在这种情况下根本没有任何文字引号,而是只有 语法(a='b'和a=b或'a=b'之间没有区别 whatsoever,因为在调用命令时它们都变成传递给execve()系统调用的相同 C 字符串数组这些参数被传递到的地方)。 -
...顺便说一句,一旦你完成了 BashFAQ #50(如上链接),BashFAQ #48 也是相关的。