Bash if then else syntax

2019-03-04 12:57发布

问题:

I'm trying to do test automation with a bash script using if then else statements but I'm running into a few errors. For one, when I try to execute it I'm doing something wrong with the variable assignment with j and k, because it tells me that the command j and the command k aren't found when I try to execute. How do you correctly create variables? The most confusing thing though is when I try to execute the script I get an error telling me I have an unexpected token near fi, and then it just says 'fi'. What am I doing wrong here?

#!/bin/bash

j = 0
k = 0

echo Test1:
echo -ne "0\nIn\nUG\n" | /u/cgi_web/Tuition/cost
echo Test2:
echo -ne "0\nOut\nUG\n" | /u/cgi_web/Tuition/cost
echo Test3:
echo -ne "0\nIn\nGR\n" | /u/cgi_web/Tuition/cost
echo Test4:
echo -ne "0\nOut\nGR\n" | /u/cgi_web/Tuition/cost

for i in {1..17}
do
    echo Test$((i+4)):
if[ "$j" -eq 0 ] && [ "$k" -eq 0 ] then
    $j = 1
    echo -ne "$i\nIn\nUG\n" | /u/cgi_web/Tuition/cost
elif[ "$j" -eq 1 ] && [ "$k" -eq 0 ] then
    $k = 1
    echo -ne "$i\nIn\nGR\n" | /u/cgi_web/Tuition/cost
elif[ "$j" -eq 1 ] && [ "$k" -eq 1 ] then
    $j = 0
    echo -ne "$i\nOut\nUG\n" | /u/cgi_web/Tuition/cost
elif[ "$j" -eq 0 ] && [ "$k" -eq 1 ] then
    $k = 0
    echo -ne "$i\nOut\nGR\n" | /u/cgi_web/Tuition/cost
fi

done

EDIT: I figure out the variable issue with j and k, I had to remove the spaces in the statement.

回答1:

Bash if statements require a semi-colon before the then:

if [ condition ] || [ condition ]; then
    # code
elif [ condition ] && [ condition ]; then
    # code
fi

For example.



回答2:

To help anyone who might look at this for help in the future, I figured I'd answer my own question with all the syntax errors I found from my own testing and with the helpful responses of others. To start the variable assignment:

j = 0

you can't have spaces in between, so it would be:

j=0

Also if statements need a space between if and the bracket and need a semicolon after the last bracket before then. Therefore my incorrect if statement

if[ "$j" -eq 0 ] && [ "$k" -eq 0 ] then

becomes

if [ "$j" -eq 0 ] && [ "$k" -eq 0 ]; then

or instead of a semicolon you can have a new line between the bracket, so it would become

if [ "$j" -eq 0 ] && [ "$k" -eq 0 ]
then