Shell

case + 如何在 case 語法中實現等於或小於或大於

  • March 31, 2019

我的目標是使用(僅使用case+ esac)驗證數字範圍,並列印範圍。例如:

  • 如果數字在 0 到 80 之間,則列印>=0<=80
  • 如果數字在 81 到 100 之間,則列印>=81<=100
  • 等等

僅當數字介於 0 和 9 之間時,我的腳本的問題才列印>=0<=90。如何修復我的腳本,以便它根據數字範圍列印正確的輸出?

#!/bin/ksh
read number 
case $number in 
[0-80])  echo ">=0<=80";; 
[81-100]) echo ">=81<=100";; 
[101-120]) echo ">=101<=120";;
[121-300]) echo ">=121<=300";;
esac

case僅用於模式匹配,它不會進行算術評估(除非您考慮擴展模式匹配運算符)zsh。僅基於其中指定的集合匹配一個字元(或某些實現中的<x-y>整理元素)*。*因此,例如,如果一個字元是to或之一(即 0、1、2、3、4、5、6、7、8 之一),它將匹配一個字元。[...]``[0-80]``0``8``0

您可以將數字與以下模式匹配:

case $(($number)) in
 ([0-9]|[1-7][0-9]|80) echo ">=0<=80";;
 (8[1-9]|9[0-9]|100) echo ">=81<=100";;
 ... and so on
esac

但是您可以很容易地看出它不是正確的工具。

[...]匹配指定字元列表中的一個字元,因此匹配任何[121-300]1、2、1 到 3、0 或 0 的字元,因此它與[0-3]or相同[0123]

採用:

if [ "$number" -ge 0 ] && [ "$number" -le 80 ]; then
 echo ">=0<=80"
elif [ "$number" -ge 81 ] &&  [ "$number" -le 100 ]; then
 echo ">=81<=100"
elif ... and so on
 ...
fi

另一種使用方式case是:

case $((
 (number >= 0 && number <= 80)   * 1 +
 (number > 80 && number <= 100)  * 2 +
 (number > 100 && number <= 120) * 3 +
 (number > 120 && number <= 300) * 4)) in
 (1) echo ">=0<=80";;
 (2) echo ">=81<=100";;
 (3) echo ">=101<=120";;
 (4) echo ">=121<=300";;
 (0) echo "None of the above";;
esac

或者使用三元運算符 ( x ? y : z):

case $((
 number >= 0 && number <= 80   ? 1 :
 number > 80 && number <= 100  ? 2 :
 number > 100 && number <= 120 ? 3 :
 number > 120 && number <= 300 ? 4 : 0)) in...

或者像@mikeserv 一樣,跳出框框思考,反轉case邏輯並匹配1那些算術比較的值

引用自:https://unix.stackexchange.com/questions/65310