bash-if之后在while循环中出现“ [:过多参数”错误

时间:2019-08-28 09:49:49

标签: bash

首先:我对bash批处理脚本还很陌生,但是有其他脚本和编程语言的经验

第二:我已经看过Meaning of "[: too many arguments" error from if[] (square brackets),但这不能解决我的问题。

我正在bash脚本中创建一个命令行解析器。我的第一次尝试实际上已经有效,但在主循环中仍要解决一些if语句代码重复的问题,因此我将其移至实际的解析函数,然后遇到“ [:过多参数”我无法解决的错误(在变量中添加“”不起作用)在一段代码中有效,如果我不移动if的话。

注意:在实际的代码中,还有一个命令行选项,出于两个原因,我省略了该选项:

  1. 简短列表
  2. 所有选项均显示错误

工作代码如下:

    arg_str = $@
    args=("$@")
    arglen=$#

    target=some_filename.txt
    in_dir=/some_input_dir/

    function working_parser()
    {
        local option=$1
        myresult=''

        i=0

        while [ ${args[i]} != $option -a $i -n $arglen ]
        do
            i=$((i+1))
        done
        #TODO add check on $i>arglen
        myresult=${args[$((i+1))]}
    }

    if [[ $arg_str == *'-t'* ]]; then
        working_function '-t'
    fi
    if [[ $myresult != '' ]]; then
        target=$myresult
    fi


    if [[ $arg_str == *'-i'* ]]; then
        working_function '-i'
    fi
    if [[ $myresult != '' ]]; then
        in_dir=$myresult
    fi

失败的代码看起来像这样(删除定义,因为它们与工作代码相同)。 “ [:过多参数”错误在while循环中发生,而在工作版本的同一代码中未发生。

    function failing_parser()
    {
        local option=$1
        myresult=''

        if [[ $arg_str == *$option* ]]; then
            i=0

            while [ ${args[i]} != $option -a $i -n $arglen ]
            do
                i=$((i+1))
            done
            #TODO add check on $i>arglen
            myresult=${args[$((i+1))]}
        fi
    }

    failing_parser '-t'
    if [[ $myresult != '' ]]; then
        target=$myresult
    fi

    failing_parser '-i'   
    if [[ $myresult != '' ]]; then
        in_dir=$myresult
    fi

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

参数太多,因为-n是一元运算符,而不是二进制运算符。也许您是说-ne

while [ "${args[i]}" != "$option" -a "$i" -ne "$arglen" ]

-a被认为是不可携带且过时的;最好使用两个由[连接的单独的&&命令:

while [ "${args[i]}" != "$option" ] && [ "$i" -ne "$arglen" ]

但是,由于您已经在使用一个bash特定的功能(数组),因此也可以使用[[ ... ]]

while [[ "${args[i]}" != "$option" && "$i" -ne "$arglen" ]]

甚至算术命令:

while [[ "${args[i]}" != "$option" ]] && (( i != arglen ));