linux shell 脚本语法错误:单词意外(预期“fi”)

linux shell 脚本语法错误:单词意外(预期“fi”)

下面是我编写的一个 shell 脚本,当我尝试执行它时,我的终端中出现一个描述“expecting fi”关键字的错误。我把它写在 done 关键字之前,但仍然没有设法克服这个错误。有人能告诉我如何解决这个错误,以及我的方法中哪里出了错吗?

    VAL1=0
    VAL2=0

    while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
        do read -p "Enter values for both numbers" VAL1 VAL2
            if [ "$VAL1" -eq 99 ]  || [ "$VAL1" -eq 99 ] 
                then break 
            else read -p "Enter value number two" VAL2
                if [ "$VAL2" -eq 0 ]
                    then echo "Cannot divide by zero"
                else echo $(( VAL1 / VAL2 ))
    fi
    done

答案1

“Expecting fi” 表示您的脚本缺少此关键字。您的例子中有两个ifs,但只有一个fi,第一个未关闭。请将其更正为:

            else echo $(( VAL1 / VAL2 ))
            fi
        fi
done

为了调试 shell 脚本,最好使用外壳检查任何一个在线的或者通过命令shellchecksudo apt install shellcheck):

$ shellcheck myscript

Line 4:
    while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
    ^-- SC1009: The mentioned syntax error was in this while loop.

Line 6:
            if [ "$VAL1" -eq 99 ]  || [ "$VAL1" -eq 99 ] 
            ^-- SC1046: Couldn't find 'fi' for this 'if'.
            ^-- SC1073: Couldn't parse this if expression. Fix to allow more checks.

Line 13:
    done
    ^-- SC1047: Expected 'fi' matching previously mentioned 'if'.
        ^-- SC1072: Unexpected keyword/token. Fix any mentioned problems and try again.

答案2

正如 dessert 已经指出的那样,有两个ifs 但只有一个fi会立即告诉您条件语句中的某处不匹配。

我建议的一件事是,在编码时,使用缩进有助于确定是否缺少任何结构。保持你的if-then-else-fi在同一列中是一种可以用来跟踪这些事情的技巧。同样适用于case-esacdo-done

使用您的示例代码,如果我们以这种方式缩进,那么缺少某些内容就会很明显:

VAL1=0 
VAL2=0

while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
do 
  read -p "Enter values for both numbers" VAL1 
  if [ "$VAL1" -eq 99 ]  || [ "$VAL1" -eq 99 ] 
  then 
    break 
  else 
    read -p "Enter value number two" VAL2
    if [ "$VAL2" -eq 0 ]
    then 
      echo "Cannot divide by zero"
    else 
      echo $(( VAL1 / VAL2 )) 
    fi 
  ??     <------ *Missing fi would likely have been detected here*
done

相关内容