Bash“if”语句引发“太多论点”

时间:2013-09-28 22:36:24

标签: bash if-statement

这是产生错误的代码:

#!/bin/bash
types=([i]=Info [w]=Warning [e]=Error [se]=Severe)

function isValidType
{
    for type in "${!types[@]}"
    do
        if [ $1 == $type ]; then
            return 0
        fi
    done
    return 1
}

if [ isValidType "$msgType" -eq 1 ]; then # <---- error here
    echo "Invalid type."
    exit 0
fi

3 个答案:

答案 0 :(得分:3)

if语句的语法是:

if <list>; then <list>; [elif <list>; then <list>;]* [else <list>;]? fi

其中<list>是由;&&||分隔的任何“管道”序列。 (管道是由|符号分隔的一个或多个简单命令。)

首先执行if之后的<list>并检查返回代码来评估if语句,返回代码将是执行的最后一个简单命令的返回代码。在此基础上,决定是否执行<list> then {如果第一个列表成功)或继续进行elif测试和/或{{1}条款。

语法中没有任何地方出现else,并且有充分的理由。 [实际上是一个命令。事实上,几乎[的同义词;区别在于test坚持其最后一个参数为[

使用]有时很方便(虽然使用[几乎总是更方便,但这是另一天的文章),但绝不是强制性的。如果您只想测试命令是否成功,请执行以下操作:

[[

如果您只需要执行某些操作,请使用if isValidType "$msgType"; then # it's valid else # it's not valid fi 特殊表单:

!

答案 1 :(得分:2)

更改此

if [ isValidType "$msgType" -eq 1 ]; then

isValidType "$msgType"
if [ $? -eq 1 ]; then 

[test命令,它接受表达式并且不能按照您的设计工作(比较函数的返回值)。

答案 2 :(得分:-1)

要检查函数是否返回true,执行此操作的正确方法是:

if [ !isValidType ]; then
       // would throw a flag for any options passed that are invalid
       // error output
fi

如果isValidType为1或0,则此方法有效。 我认为问题在于您正在检查数组。

希望这有帮助。