【问题标题】:Bourne shell: send arguments $2 to $N to variadic function?Bourne shell:将参数 $2 到 $N 发送到可变参数函数?
【发布时间】:2012-08-13 17:37:53
【问题描述】:

Google 终于让我失望了。我似乎无法在 Bourne shell 脚本中找到如何做到这一点:

我正在编写一个 shell 脚本来处理我对一个项目的所有测试。我已经为该脚本可以执行的每个任务(构建、运行、清理等)设置了函数,并且希望将任何其他命令行参数(除了命令本身)传递给所需的函数。

例子:

./test.sh build -j 应该将-j 传递给build 函数。

此逻辑的伪代码版本如下所示:

function build() {
   make $*
}

if [ $1 == 'build' ]; then
   build $2 -> $N
fi

我怎样才能做到这一点?

【问题讨论】:

    标签: shell variadic-functions sh


    【解决方案1】:

    除非您想发出更详细的错误消息,否则无需显式测试$1。做吧:

    #!/bin/sh -e
    function build() {
       make "$@"
    }
    
    "$@"
    

    如果$1 命名了一个有效的函数,它将根据需要调用。如果没有,您将收到一条错误消息,可能还不错,具体取决于您的 shell。

    【讨论】:

      【解决方案2】:
      function build() {
         make "$@"
      }
      
      if [ "$1" == 'build' ]
      then shift        # Lose $1
           build "$@"   # Pass what was $2 .. $N
      fi
      

      注意"$@" 在函数本身和函数调用中的使用。我认为在没有双引号或 "$*" 的情况下使用 $*$@ 很少是正确的;只有"$@" 保留原始参数列表的间距,如果您有包含空格的参数,这很重要。如果您要回应这些论点,那么echo "The arguments: $*" 是合理的。否则,90% 以上的情况下,您最好使用"$@"。对于在测试运算符中引用"$1",我也采取了极其保守的态度;小心省略引号。

      另见:

      【讨论】:

        【解决方案3】:

        我认为您可以使用shift 命令实现此效果。它将所有位置参数向下移动一位并降低$1 的值(因此$3 的值被移动到$2$2 的值被移动到$1$1 丢失)。完成后,您可以使用 $@ 获取您真正感兴趣的参数列表,例如

        function build() {
            echo "build with $@"
        }
        
        echo "Starting args are $@"
        cmd=$1
        shift
        
        if [ "$cmd" = 'build' ]; then
            build "$@"
        fi
        

        【讨论】:

        • 你应该在build的调用中使用"$@",否则就可以了。
        猜你喜欢
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 2011-11-24
        • 2011-01-04
        • 1970-01-01
        • 2013-12-20
        相关资源
        最近更新 更多