“需要整数表达式”错误

“需要整数表达式”错误

我正在运行以下脚本:

#!/bin/bash
# This script acts as a simple calculator for add, subtract, multiply and divide.
echo "Kindly ENTER 'a' to select for addition"
echo "Kindly ENTER 's' to select for subtraction"
echo "Kindly ENTER 'm' to select for multiplication"
echo "Kindly ENTER 'd' to select for division"
read oper
echo "Please ENTER any number of your choice"
read no1
echo "Please ENTER another number of your choice"
read no2
if [ $oper -eq a ]; then 
echo "Your addition result is: $(($no1 + $no2))" 
elif [ $oper -eq s ]; then 
echo "Your subtraction result is: $(($no1 - $no2))"
elif [ $oper -eq m ]; then 
echo "Your multiplication result is: $(($no1 * $no2))"
elif [ $oper -eq d ]; then 
echo "Your division result is: $(($no1 / $no2))"
else echo "Your selection from the begining was incorrect"
fi

这是错误/输出:

./test2.sh: line 12: [: m: integer expression expected
./test2.sh: line 13: [: m: integer expression expected
./test2.sh: line 14: [: m: integer expression expected
./test2.sh: line 15: [: m: integer expression expected
Your selection from the begining was incorrect

请问可能是什么原因?

答案1

-eq运算符是特定于整数值的关系运算符。这些运算符不适用于字符串值,除非它们的值为整数。

因此使用=which检查两个字符串操作数的值是否相等

答案2

正如其他人所说,-eq是一个仅适用于整数的比较运算符。贝壳测试实用程序有多个用于不同目的的操作数。更好地了解它们可能会很有用。

文件测试操作员

  • -b- 如果文件是块特殊文件则为 True
  • -c- 如果文件是字符特殊文件则为 True
  • -d- 如果文件是目录则为真
  • -e- 如果文件存在则为真
  • -f- 如果文件是“常规文件”,则为 True
  • -g- 如果文件设置了 SGID 位则为 True
  • -h- 如果文件是符号链接则为 True
  • -L- 如果文件是符号链接则为 True
  • -p- 如果文件是 FIFO,则为 True
  • -r- 如果您具有文件的读取权限,则为 True
  • -S- 如果文件是 aa 套接字则为 true
  • -s- 如果文件大小大于 0,则为 True
  • -u- 如果文件设置了 setuid 标志则为 True
  • -w- 如果您有文件写入权限,则为 True
  • -x- 如果您具有文件的执行权限,则为 True

字符串运算符(将使用整数,但会将它们视为字符串)

  • =- 如果左手字符串等于右手字符串,则为 True
  • !=- 如果左手字符串不等于右手字符串,则为 True
  • -z- 如果字符串长度为零则为真
  • -n- 如果字符串长度非零则为真
  • string- 如果字符串存在则为真

关系运算符(不适用于字符串)

  • -eq- 如果左手整数等于右手整数则为 True
  • -ne- 如果左手整数不等于右手整数,则为 True
  • -gt- 如果左手整数大于右手整数则为 True
  • -ge- 如果左手整数大于或等于右手整数,则为 True
  • -lt- 如果左手整数小于右手整数则为 True
  • -le- 如果左手整数小于或等于右手整数,则为 True

布尔运算符

  • !- 如果表达式为假则为真
  • -o- 如果左手表达式或右手表达式为真,则为真
  • -a- 如果左手表达式和右手表达式都为真,则为真

算术运算符(在 shell 算术扩展或 内expr

  • +- 在运算符两侧添加值
  • -- 从左手整数中减去右手整数
  • *- 乘以运算符两侧的值
  • /- 将左手整数除以右手整数
  • %- 将左手整数与右手整数相除并返回余数
  • =- 将右手分配给左手
  • ==- 如果两个整数相等则为 True
  • !=- 如果两个整数不相等则为 True

其他

  • -t- 如果文件描述符已打开并与终端关联,则为 True

答案3

出于教育目的,另一种对计算器进行编码的方法。随意问的问题。

#!/bin/bash
declare -A operations=([addition]=+ [subtraction]=- [multiplication]='*' [division]=/)
PS3="Which calculation do you want? "
select ans in "${!operations[@]}" quit; do
    [[ $ans == quit ]] && break
    [[ -z $ans ]] && continue
    read -p "Enter two numbers separated by a space: " -r a b x
    echo "Your $ans result is: $(( a ${operations[$ans]} b ))"
done

  1. PS3是用于select提示的 bash 变量。这比 echo 更好,因为 select 会根据需要经常重新提示——例如,如果您输入无效响应。
  2. 引用the'*'是为了防止它扩展为文件名列表。看文件名扩展在 bash 手册中。事后看来,这可能不是必需的,我无法很快在手册中找到明确的声明。一般来说,对于 bash,当不确定时,添加引号通常是正确的方法。

答案4

正如 @steeldriver 所写,使用=而不是-eq.

相关内容