这是产生错误的代码:
#!/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
答案 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,则此方法有效。 我认为问题在于您正在检查数组。
希望这有帮助。