1

我想做类似的事情.. 如果标记在 80-100 之间,它将显示 A+ 如果标记在 70-79 之间,它将显示 A 等

我想用“case in esac”而不是 if-elif-fi

但是我该如何做复杂的表达以防万一

echo “enter mark”
read mark
case $mark in
(( mark>=80 && mark<=100 ))) echo “A+”
..
..
..
esac

我试过这个。使用 if-elif-fi 很容易,但在“案例”中我应该做什么谢谢。

4

3 回答 3

3

您没有指定外壳,所以让我插入zsh

#!/bin/zsh

echo “enter mark”
read mark
case $mark in
    <80-100>) echo "A+" ;;
    <70-79>) echo "A" ;;
    ...
esac

也就是说,POSIXcase语句(以及case大多数 shell 中的语句)旨在匹配文本模式,而不是算术比较。您可以使用case语句,但它可能会变得丑陋。

case $mark in
    [89]?|100) echo "A+" ;;
    7?) echo "A" ;;
    ...
esac

在这种情况下,情况还不错,因为您没有像 那样65-74的范围,但是if声明会更好。

if (( mark >=80 && mark <=100 )); then
    echo "A+"
elif (( mark >=70 )); then
    echo "A"
elif ...; then
    ...
else
    ...
fi
于 2013-03-30T19:24:42.530 回答
1

如果条件更容易使用

if [[ ${mark} -ge 80 && ${mark} -le 100 ]]; then
        echo "A+"
fi

但是如果你仍然需要大小写,那么你需要指定一个模式

case ${mark} in
8[0-9]|9[0-9]|100)
        echo  "A+"
esac
于 2013-03-30T19:15:02.010 回答
0

在常规的 POSIX-ish shell 中:

echo "enter mark"
read mark
case "$mark" in
([89][0-9]|100) echo "A+";;
(7[0-9])        echo "Grade";;
(6[0-9])        echo "Grade";;
...
esac

表达式的前导左括号是可选的。

于 2013-03-30T19:36:21.720 回答