linux shell script Syntax error: word unexpected (expecting "fi")

5,008

Solution 1

“Expecting fi” means your script is missing this keyword. In your case you have two ifs, but only one fi, leaving the first unclosed. Correct it to:

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

In order to debug shell scripts it’s a good idea to use shellcheck either online or via the command shellcheck (sudo 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.

Solution 2

As dessert already pointed out, having two ifs but only one fi immediately tells you that there is a mismatch somewhere in your conditional statement.

One thing I would suggest is that when coding, it helps to use your indentation to help figure out if you are missing any structure. Keeping your if-then-else-fi within the same column is one trick that can be used to keep track of these things. Same for the case-esac or the do-done for that matter.

Using your sample code, if we indent in that manner, it's pretty clear with regards to something missing:

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
Share:
5,008

Related videos on Youtube

Roosevelt Mendieta
Author by

Roosevelt Mendieta

Updated on September 18, 2022

Comments

  • Roosevelt Mendieta
    Roosevelt Mendieta over 1 year

    Below I have a shell script i wrote and when I try to execute it I get an error in my terminal describing the "expecting fi" keyword. I have written it down before the done keyword and have still not managed to overcome to error. Can anybody tell me as to how to solve this error and where in my approach I have made the mistake?

        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
    
    • cmak.fr
      cmak.fr about 5 years
      note: you can get a near debug mode with #!/bin/bash -x on the first line of your script OR by starting the script with bash -x ./myscript.sh