在linux shell中的复杂表达式

时间:2013-03-30 19:08:00

标签: linux shell

我想做点什么...... 如果标记在80-100之间,它将显示A + 如果标记在70-79之间,它将显示A. 等

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

来做

但是我如何做

的复杂表达
echo “enter mark”
read mark
case $mark in
(( mark>=80 && mark<=100 ))) echo “A+”
..
..
..
esac
我尝试过这个。 if-elif-fi很容易,但我应该在'case'中做些什么 谢谢。

3 个答案:

答案 0 :(得分:3)

你没有指定shell,所以让我插上zsh

#!/bin/zsh

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

也就是说,POSIX case语句(以及大多数shell中的case语句)适用于匹配文本模式,而不是算术比较。 可以使用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

答案 1 :(得分: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

答案 2 :(得分: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

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