问题
我想按原样使用给脚本的参数- 带引号和所有内容。到目前为止,我发现的所有解决方案都去掉了引号,或者做一些微妙的不同。
设想
例如,我有一个接受字符串作为命令行参数的工具
./tool --formula="AG EF phi;"
我还有一个应该调用脚本的包装脚本。它的调用应该是
wrap.sh ./tool --formula="AG EF phi;"
这个脚本做了类似的事情
# preparation phase
# ...
# call tool and remember exit code
$*
result=$?
# evaluation phase
# ...
exit $result
不幸的是,该工具随后被称为
./tool --formula=AG EF phi;
这与上面不同,会产生语法错误。我发现的唯一黑客会给我类似的东西
./tool "--formula=AG EF phi;"
这也是错误的。
细节
具体来说,这里有一些虚拟代码来举例说明这个问题:
首先,C程序“tool.c”。
#include <stdio.h>
int main(int argc, char** argv) {
int i;
for (i = 0; i < argc; i++) {
printf("%d: %s\n", i, argv[i]);
}
return 0;
}
然后,包装脚本“wrap.sh”:
#!/bin/bash
echo $*
$*
exit $?
现在这是我尝试过的:
$ ./tool --formula="Foo bar"
0: ./tool
1: --formula=Foo bar
$ ./wrap.sh ./tool --formula="Foo bar"
./tool --formula=Foo bar
0: ./tool
1: --formula=Foo
2: bar
$ ./wrap.sh ./tool --formula="\"Foo bar\""
./tool --formula="Foo bar"
0: ./tool
1: --formula="Foo
2: bar"
$ ./wrap.sh ./tool --formula="\"Foo bar\""
./tool --formula="Foo bar"
0: ./tool
1: --formula="Foo
2: bar"
$ ./wrap.sh "./tool --formula=\"\\\"Foo bar\\\"\""
./tool --formula="\"Foo bar\""
0: ./tool
1: --formula="\"Foo
2: bar\""
这就是我想要的(对于包装脚本中的任何必要更改):
$ ./wrap.sh ./tool --formula="Foo bar"
0: ./tool
1: --formula=Foo bar
提案
转义行情
当我转义像Shabaz 提议的引号时,变量$*
包含正确引用的字符串,例如:
wrap.sh ./tool --formula="\"AG EF phi;\""
然后在wrap.sh
代码中:
echo $*
会产生
./tool --formula="AG EF phi;"
但是,执行$*
会产生如上的确切错误:参数 offormula
在“AG”之后被剥离。此外,最好不要转义引号。
不同的外壳有帮助吗?