gpt4 book ai didi

bash - Bash 中的表达式递归级别超出错误

转载 作者:行者123 更新时间:2023-11-29 09:05:16 26 4
gpt4 key购买 nike

我是 bash 脚本的新手,正在尝试做一些练习。当我试图用“完成”字符串停止程序时出现这样的错误。:

line 9: ((: finish: expression recursion level exceeded (error token is "finish").

问题是什么?我也想了解我的其他缺点。我的程序是:

#!/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"

最佳答案

引自@barmar's great answer到相关问题,该问题与@GordonDavisson 在他的评论中提到的相同问题:

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.


最简单的解决方案是为您的变量使用不同的名称 - 比如说 finish_string="finish" 而不是 finish="finish"

此外,您可以使用正则表达式匹配来查看该值是否为数字(注意:不需要美元符号来扩展算术表达式 ((...)) 中的变量),然后进行数字比较,然后进行正常的字符串比较,以查看值是否为“完成”:

if [[ $number =~ ^[0-9]+$ ]] && ((number > temp)); then
temp=$number
elif [[ $number == $finish ]]; then
break
fi

或者,您可以在进行数字比较之前明确检查用户是否输入了数字:

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

使用 bash -x yourscript.sh 运行您的脚本以对其进行调试。


相关:

另见:

关于bash - Bash 中的表达式递归级别超出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52753408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com