Bash脚本中expr模运算失效报'integer expression expected'问题
Bash中expr模运算未正常执行的原因及解决方法
原脚本
#!/bin/bash echo "Enter a number" read num i=2 res=true while [ $i -le $num ] do if [ `expr $num%$i` -eq 0 ] then res=false fi i=`expr $i + 1` done echo "$res"
运行错误输出
Enter a number 6 ./4.sh: line 8: [: 6%2: integer expression expected ./4.sh: line 8: [: 6%3: integer expression expected ./4.sh: line 8: [: 6%4: integer expression expected ./4.sh: line 8: [: 6%5: integer expression expected ./4.sh: line 8: [: 6%6: integer expression expected true
问题原因
expr命令的运算符(包括模运算符%)必须和左右操作数之间保留空格。你写的expr $num%$i里,%和$num、$i之间没有空格,expr会把$num%$i整体当成一个普通字符串返回,而不是执行模运算。这就导致[命令拿到的是6%2这类字符串,无法识别为整数,因此报错“integer expression expected”。
修正后的脚本
把模运算的表达式改成expr $num % $i,同时优化循环范围(判断质数只需循环到数字的平方根即可,提升效率):
#!/bin/bash echo "Enter a number" read num if [ $num -le 1 ]; then echo "false" exit fi i=2 res=true # 循环到平方根即可 while [ $((i*i)) -le $num ] do if [ `expr $num % $i` -eq 0 ] then res=false break # 找到因数后直接跳出循环 fi i=`expr $i + 1` done echo "$res"
内容的提问来源于stack exchange,提问作者Mohit Naik
相关产品推荐
相关产品推荐

