Linux while循环中的Case语句,shell脚本

Linux while循环中的Case语句,shell脚本,linux,bash,shell,Linux,Bash,Shell,我正在写一个简短的shell脚本,它接受从1到12的数字,并打印出相应的月份。一月=1二月=2等等 这是我迄今为止所写的,它运行良好: #!/bin/sh x=0 echo Enter the number read x case $x in 1) echo January ;; 2) echo February ;; 3) echo March ;; 4) echo April ;; 5) echo May ;; 6) echo June ;; 7) ec

我正在写一个简短的shell脚本,它接受从1到12的数字,并打印出相应的月份。一月=1二月=2等等

这是我迄今为止所写的,它运行良好:

#!/bin/sh 
x=0 
echo Enter the number 
read x 
case $x in 

1) 
echo January
;; 
2) 
echo February
;; 
3) 
echo March
;; 
4) 
echo April
;; 
5) 
echo May
;; 
6) 
echo June
;; 
7) 
echo July
;;
8) 
echo August
;;
9) 
echo September
;; 
10) 
echo October
;; 
11) 
echo November
;; 
12) 
echo December
;; 
*) 
echo Not sure that about one 
;; 

esac
然而,我想知道是否有可能将case语句放入while循环中?因此,当有人选择号码时,他们可以一次又一次地选择另一个号码。例如,只有当用户输入exit时,程序才会停止

可能吗?或者有比使用while循环更好的选择吗

谢谢大家!

当然可以:

while true; do
    read x
    case $x of
        exit) break ;;
        1) echo January ;;
        2) echo February ;;
        # ...
        12) echo December ;;
        *) echo "Unknown response, enter a number 1-12 or type 'exit' to quit" ;;
    esac
done
当然:

while true; do
    read x
    case $x of
        exit) break ;;
        1) echo January ;;
        2) echo February ;;
        # ...
        12) echo December ;;
        *) echo "Unknown response, enter a number 1-12 or type 'exit' to quit" ;;
    esac
done
在这里使用bash select语句是一个不错的选择:

months=( January February ... December )
select choice in "${months[@]}" Exit; do
    if [[ $choice = "Exit" ]]; then
        break 
    elif [[ " ${months[*]} " == *" $choice "* ]]; then
        echo "$choice"
    else
        echo "invalid selection: $REPLY"
    fi
done
在这里使用bash select语句是一个不错的选择:

months=( January February ... December )
select choice in "${months[@]}" Exit; do
    if [[ $choice = "Exit" ]]; then
        break 
    elif [[ " ${months[*]} " == *" $choice "* ]]; then
        echo "$choice"
    else
        echo "invalid selection: $REPLY"
    fi
done

你也可以这样做

PS3="month or <q> to exit: ";
select m in $(cal -y | awk '(NR-2)%9 == 0 {print}'); do [[ "$REPLY" == 'q' ]] && break; echo "m=$m"; done
以防您不想键入月份


根据LANG env变量的值,它在不同的语言中工作。

您也可以这样做

PS3="month or <q> to exit: ";
select m in $(cal -y | awk '(NR-2)%9 == 0 {print}'); do [[ "$REPLY" == 'q' ]] && break; echo "m=$m"; done
以防您不想键入月份

根据LANG env变量的值,它在不同的语言中工作