初学者脚本帮助

初学者脚本帮助

我正在为一个类制作一个脚本,该脚本应该要求您输入两个整数,然后要求您选择 a / s / m / d 进行加、减、乘或除。它还将确保您输入了一个整数和一个有效的选项,但我稍后会处理这个问题。现在这是我所拥有的:

#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func

if [ "$func" -eq "a" ]; then
       echo $((num1 + num2))
fi 

if [ "$func" -eq "s" ]; then
       echo $((num1 - num2))
fi 

if [ "$func" -eq "m" ]; then
       echo $((num1 * num2))
fi 

if [ "$func" -eq "d" ]; then
       echo $((num1 / num2))
fi 

else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"

当我运行它时,它会正确要求内容,但我收到了我不理解的错误:

./MathTest.sh: line 9: [: a: integer expression expected
./MathTest.sh: line 13: [: a: integer expression expected
./MathTest.sh: line 17: [: a: integer expression expected
./MathTest.sh: line 21: [: a: integer expression expected
./MathTest.sh: line 25: syntax error near unexpected token `else'
./MathTest.sh: line 25: `else'

请有人帮我解决这个问题吗?

答案1

  1. 您需要使用字符串比较 ( =) 而不是整数比较 ( eq)。

  2. 你的脚本中的语句else没有对应的if语句。如果您想要执行一系列 if/then/else if/then/.../else 语句,则需要使用if ... elif ... elif .... else ... fi... 而不是if ... fi; if ... fi; if ... fi; else 或者使用一个case声明。

    如果不明显,elif则表示else if.

    例如:

#!/bin/bash
echo "Please input a whole number"

read num1

echo "Please input another whole number"

read num2

echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"

read func

case "$func" in
  a) echo $((num1 + num2)) ;;
  s) echo $((num1 - num2)) ;;
  m) echo $((num1 * num2)) ;;
  d) echo $((num1 / num2)) ;;
  *) echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide" ;;
esac

请注意,每种情况的代码都需要以两个分号结尾;;- 这是因为每种情况可以有多个代码语句(用换行符或单个分号分隔),因此 shell 解释器需要某种方式来区分另一个情况该案例的声明和案例的结束,以及;;它用于执行此操作的内容。

一个简单的示例,显示每个案例两个语句:

case "$func" in
  a) echo "addition:"    ; echo $((num1 + num2)) ;;
  s) echo "subtraction:" ; echo $((num1 - num2)) ;;
...
esac

您可以使用 if/elif/else/fi代替case语句(在我看来,这可以使代码更具可读性 - 当然也更短,重复性更少),您可以使用 if/elif/else/fi ,如下所示:

if [ "$func" = "a" ]; then
  echo $((num1 + num2))
elif [ "$func" = "s" ]; then
  echo $((num1 - num2))
elif [ "$func" = "m" ]; then
  echo $((num1 * num2))
elif [ "$func" = "d" ]; then
  echo $((num1 / num2))
else
  echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
fi 

请注意,这是使用=而不是-eq进行比较(因为它是比较字符串,而不是数字),并且它是一长串 if、elif、elif、elif、else、fi 语句,而不是单个 if ... fi 语句。

顺便说一句,if/elif/fi 链和多个 if ... fi 语句之间有一个非常重要的区别。对于 if/elif/elif/elif/.../else/fi,只有第一的true 结果将永远执行(如果没有一个为 true,则执行 else 代码),并且 shell 将跳到整个链的末尾,类似于语句的case ... esac工作方式。

对于多个if ... fi语句,将依次评估每个语句,并且将执行每个评估为 true 的语句,独立于所有其他测试。

相关内容