I'm a newbie to bash scripting and trying to do some exercises. Getting error like this when I'm trying to stop the program with "finish" string.:
line 9: ((: finish: expression recursion level exceeded (error token is "finish").
What is the problem? Also I'd like to learn my other faults. My program is:
#!/bin/bash
number=0
finish="finish"
temp=0
echo "Enter a number."
while true;
do
read -r number
if (( $number > $temp ))
then
temp=$number
fi
if [[ $number == $finish ]]
then
break
fi
done
echo "Largest : $temp"
To quote from @barmar's great answer to the related question, which talks about the same issue that @GordonDavisson mentions in his comment:
When you use a variable in an arithmetic expression, but the value is not a number, the shell treats it as another expression to evaluate. So if the value is a variable name, it will get the value of that variable and use it. But in this case, you have it pointing to itself. So to evaluate a it has to evaluate
$finish, and this keeps repeating infinitely.
The simplest solution is to use a different name to your variable - say finish_string="finish" instead of finish="finish".
Also, you can use a regex match to see if the value is numeric (note: a dollar sign is not needed to expand variables inside arithmetic expression ((...))), then do the numeric comparison followed by the normal string comparison to see if the value is 'finish':
if [[ $number =~ ^[0-9]+$ ]] && ((number > temp)); then
temp=$number
elif [[ $number == $finish ]]; then
break
fi
Or, you could explicitly check if the user entered a number before doing a numeric comparison:
if [[ $number == $finish ]]; then
break
else
[[ $number =~ ^[0-9]+$ ]] || { echo "Enter a valid number or 'finish' to stop"; continue; }
if ((number > temp)); then
temp=$number
fi
fi
Run your script with bash -x yourscript.sh to debug it.
Related:
See also:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With