confusified
confusified

Reputation: 2330

Bash, if's, reusing variables

if [[ $line == *"option 1"* ]]
then
     CURRENT_OPTION=1
fi

if [[ $line == *"option 2"* ]]
then
     CURRENT_OPTION=2
fi

if [[ $line =~ "What i want" ]]
then            
    if [[ $CURRENT_OPTION -eq 1 ]]
    then
        MEM1=$(awk '/Used heap/ { gsub(/M/, " "); print $4 }')
    elif [[ $CURRENT_OPTION -eq 2 ]]
    then
        MEM2=$(awk '/Used heap/ { gsub(/M/, " "); print $4 }')
    fi
fi

Because CURRENT_OPTION is defined within an if, its value is not correct when checked in the third if. How do I pass it out so that it is?

Upvotes: 1

Views: 804

Answers (2)

Lee Netherton
Lee Netherton

Reputation: 22512

In all of your if statements you should enclose the variables in double quotes. If the variable is an empty string (or if the variable doesn't exist) then the if statement will not contain enough arguments and will throw an error.

Here is an example:

if [[ $var -eq 1 ]]
then 
    echo yes
else
    echo no
fi

If var is uninitialised, bash will expand the statement to look like this:

if [[ -eq 1 ]]
then 
    echo yes
else
    echo no
fi

There are not enough arguments to make the if statement valid here, and bash will throw an error:

bash: conditional binary operator expected
bash: syntax error near `1'

By wrapping the variable in quotes, this situation is avoided. This statement:

if [[ "$var" -eq 1 ]]
...

is expanded to:

if [[ "" -eq 1 ]]
...

and now the if statement has enough arguments (the first one being an empty string) to parse.

Upvotes: 0

P.P
P.P

Reputation: 121397

Just declare CURRENT_OPTION at the top, something like:

   declare -i CURRENT_OPTION=0

i to declare it as an int.

Upvotes: 1

Related Questions