1

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.

csStudent
  • 128
  • 2
  • 12

2 Answers2

1

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

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

For example.

Nunchy
  • 948
  • 5
  • 11
1

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
csStudent
  • 128
  • 2
  • 12
  • 1
    In many languages, spaces can often be added or removed to improve readability without changing the meaning. But in shell syntax, this is not the case. In the shell, spaces are important delimiters, and adding or removing them can change the meaning of a command, sometimes in unexpected ways. In the test expression, spaces are *required* between each element. In the assignment, they're forbidden. There are a few places where spaces are optional, but they're rare. – Gordon Davisson Nov 22 '18 at 01:04