好的,所以我有一个相当简单的脚本,使用各种选项运行,直到遇到一个特殊的(两个连字符),之后我希望将所有剩余的参数视为要运行的命令。 / p>
例如:
do_something.sh Foo Bar -- printf '%s\n' "Done 'Foo' and 'Bar'"
在这种情况下,脚本会在执行应生成单行文本的Foo
语句之前运行Bar
和printf
的操作。
我想知道的是,将剩余参数作为命令运行的最佳方法是什么?
目前我正在将它们处理为eval
友好字符串,因为直接通过eval "$@"
传递这些字符串似乎无法正常工作,因为这实际上会破坏{{1}完全命令(而不是"完成' Foo'和' Bar'"在它输出的一行" DonenFoonandnBarn")。但是,处理将printf
作为单个字符串传递给eval
的参数有点麻烦,因为我必须将所有内容都处理为引用安全的形式。我还尝试将参数传递给sh
或bash
,但这些参数不会将printf
或echo
等命令视为可执行文件。
那么我可以使用更直接的方法吗?
答案 0 :(得分:3)
此处您不需要eval
。 “直接”方式运作良好:
#!/bin/sh -eu
for arg in "$@"
do
shift
if [ "$arg" = '--' ]
then
break
fi
echo "Doing something else with argument '$arg'..."
done
# Execute the remainder as shell command.
"$@"
保存为demo.sh
:
$ ./demo.sh Foo Bar -- printf '%s\n' "Done 'Foo' and 'Bar'"
Doing something else with argument 'Foo'...
Doing something else with argument 'Bar'...
Done 'Foo' and 'Bar'
由于字符串只展开一次,原始标记化保持不变。
如果你想要做的就是在另一个命令成功完成后执行一个命令,你也可以使用
$ ./demo.sh Foo Bar && printf '%s\n' "Done 'Foo' and 'Bar'"
不改变脚本本身。