Cem*_*mak 5 syntax bash if-statement arithmetic-expressions
我是打击脚本并试图做一些练习的新手.当我试图用"完成"字符串停止程序时,得到这样的错误:
line 9: ((: finish: expression recursion level exceeded (error token is "finish").
Run Code Online (Sandbox Code Playgroud)
问题是什么?我还想了解其他的错误.我的计划是:
#!/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"
Run Code Online (Sandbox Code Playgroud)
引用@barmar对相关问题的精彩回答,其中讨论了 @GordonDavisson 在评论中提到的同一问题:
当您在算术表达式中使用变量但该值不是数字时,shell 会将其视为另一个表达式来计算。因此,如果该值是变量名,它将获取该变量的值并使用它。但在这种情况下,它指向自身。因此,要评估 a,它必须评估
$finish,并且这会无限重复。
最简单的解决方案是对变量使用不同的名称 - 例如,finish_string="finish"而不是finish="finish".
另外,您可以使用正则表达式匹配来查看该值是否为数字(注意:不需要美元符号来扩展算术表达式内的变量((...))),然后进行数字比较,然后进行普通字符串比较以查看该值是否为 '结束':
if [[ $number =~ ^[0-9]+$ ]] && ((number > temp)); then
temp=$number
elif [[ $number == $finish ]]; then
break
fi
Run Code Online (Sandbox Code Playgroud)
或者,您可以在进行数字比较之前显式检查用户是否输入了数字:
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 Code Online (Sandbox Code Playgroud)
运行您的脚本来bash -x yourscript.sh调试它。
有关的:
也可以看看: