首先:我对bash批处理脚本还很陌生,但是有其他脚本和编程语言的经验
第二:我已经看过Meaning of "[: too many arguments" error from if[] (square brackets),但这不能解决我的问题。
我正在bash脚本中创建一个命令行解析器。我的第一次尝试实际上已经有效,但在主循环中仍要解决一些if语句代码重复的问题,因此我将其移至实际的解析函数,然后遇到“ [:过多参数”我无法解决的错误(在变量中添加“”不起作用)在一段代码中有效,如果我不移动if的话。
注意:在实际的代码中,还有一个命令行选项,出于两个原因,我省略了该选项:
工作代码如下:
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
我在做什么错了?
答案 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 ));