【发布时间】:2012-06-07 21:12:04
【问题描述】:
问题
我想按原样使用为脚本提供的参数 - 带引号和所有内容。到目前为止,我发现的所有解决方案都去掉了引号,或者做一些微妙的不同。
场景
例如,我有一个接受字符串作为命令行参数的工具
./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 proposed 这样的引号时,变量$* 包含正确引用的字符串,例如:
wrap.sh ./tool --formula="\"AG EF phi;\""
然后在wrap.sh代码中:
echo $*
会产生
./tool --formula="AG EF phi;"
但是,执行$* 会产生与上述完全相同的错误:formula 的参数在“AG”之后被剥离。此外,最好不要转义引号。
可以使用不同的 shell 吗?
【问题讨论】:
-
这很奇怪。
$#也给出 1,这意味着$*确实是一个令牌并且没有被分解。但不知何故,当$*扩展时,它会扩展为许多令牌。 -
$* 不会按照您的想法进行标记。 “$@”(带有引号)通常更好。