1

这是产生错误的代码:

#!/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
4

3 回答 3

3

语句的语法if是:

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

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

if语句通过首先执行<list>后面的if, 并检查返回码来评估,这将是最后执行的简单命令的返回码。基于此,决定是执行<list>以下then(如果第一个列表成功)还是继续执行elif测试和/或else子句。

在该语法中没有[出现 a ,这是有充分理由的。[实际上是一个命令。事实上,它几乎是 ;的同义词test。不同之处在于它[坚持认为它的最后一个论点是]

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

if isValidType "$msgType"; then
  # it's valid
else
  # it's not valid
fi

如果你只需要在它不起作用的情况下做某事,请使用!特殊形式:

if ! isValidType "$msgType"; then
  # it's not valid
fi
于 2013-09-28T22:56:19.137 回答
2

改变这个

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

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

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

于 2013-09-28T22:38:17.067 回答
-1

要检查函数是否返回 true,正确的方法是:

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

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

希望这可以帮助。

于 2013-09-28T22:55:56.297 回答