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

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)

cod*_*ter 4

引用@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调试它。


有关的:

也可以看看: