执行剩余参数作为命令

时间:2015-02-13 13:28:19

标签: shell

好的,所以我有一个相当简单的脚本,使用各种选项运行,直到遇到一个特殊的(两个连字符),之后我希望将所有剩余的参数视为要运行的命令。 / p>

例如:

do_something.sh Foo Bar -- printf '%s\n' "Done 'Foo' and 'Bar'"

在这种情况下,脚本会在执行应生成单行文本的Foo语句之前运行Barprintf的操作。

我想知道的是,将剩余参数作为命令运行的最佳方法是什么?

目前我正在将它们处理为eval友好字符串,因为直接通过eval "$@"传递这些字符串似乎无法正常工作,因为这实际上会破坏{{1}完全命令(而不是"完成' Foo'和' Bar'"在它输出的一行" DonenFoonandnBarn")。但是,处理将printf作为单个字符串传递给eval的参数有点麻烦,因为我必须将所有内容都处理为引用安全的形式。我还尝试将参数传递给shbash,但这些参数不会将printfecho等命令视为可执行文件。

那么我可以使用更直接的方法吗?

1 个答案:

答案 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'"

不改变脚本本身。