在Bash中使用大小写范围的数字
我正在尝试在Bash中使用case
(在Linux中)。
如果X在460和660之间,则输出X信息。
如果X在661和800之间,则做其他事情。
等等。
现在这是我有:
case $MovieRes in [461-660]*) echo "$MovieName,480p" >> moviefinal ;; [661-890]*) echo "$MovieName,720p" >> moviefinal ;; [891-1200]*) echo "$MovieName,1080p" >> moviefinal ;; *) echo "$MovieName,DVD" >> moviefinal ;; esac
但不知何故480p,720p或1080p的很多都是以DVD结尾的。 variables$MovieRes
是一个简单的列表,对每一行显示一个介于1和1200之间的数字。根据这个值, case
决定应用哪个“case”。
我想知道如何实际使用case
来完成这个,因为处理这样的范围有点混乱。
在bash中,可以使用arithmetic expression
: ((...))
if ((461<=X && X<=660)) then echo "480p" elif ((661<=X && X<=890)) then echo "720p" elif ((891<=X && X<=1200)) then echo "1080p" else echo "DVD" fi >> moviefinal
bash case
语句不理解数字范围。 它了解壳模式 。
以下应该工作:
case $MovieRes in 46[1-9]|4[7-9][0-9]|5[0-9][0-9]|6[0-5][0-9]|660) echo "$MovieName,480p" >> moviefinal ;; 66[1-9]|6[7-9][0-9]|7[0-9][0-9]|8[0-8][0-9]|890) echo "$MovieName,720p" >> moviefinal ;; 89[1-9]|9[0-9][0-9]|1[0-1][0-9][0-9]|1200) echo "$MovieName,1080p" >> moviefinal ;; *) echo "$MovieName,DVD" >> moviefinal ;; esac
不过,我build议你使用一个if-else语句,并在另一个答案中比较数字范围。 case
不是解决这个问题的正确工具。 这个答案只是为了解释的目的。
只是为了颠覆的情况下做任何事情的乐趣,你可以使用$((...))
case 1 in $(($MovieRes<= 460)))echo "$MovieName,???";; $(($MovieRes<= 660)))echo "$MovieName,480p";; $(($MovieRes<= 890)))echo "$MovieName,720p";; $(($MovieRes<=1200)))echo "$MovieName,1080p";; *)echo "$MovieName,DVD";; esac >> moviefinal
类似的问题,可能是有用的人…随机附加的东西,我刚刚试过,它也检查它是一个整数,对我来说,我希望它有一个预设值,让用户改变它,如果他们input错误数据设置为默认值。
func_set_num_files(){ echo "How many files do you want to create? (input a number 1-10000)" read X # 1, is it a number, #2 is it within max range? if [[ $X != *[!0-9]* ]]; then if ((1<=X && X<=10000)) ;then echo "NUM_FILES=$X" NUM_FILES=$X else echo "Invalid input, setting to default value [ $NUM_FILES ].";sleep 3 fi else echo "Invalid input, non-numeric values entered, setting to default value [ $NUM_FILES ].";sleep 3 fi }
另一个使用'case'来检查一个variables是否在整数范围内的例子:
检查$ MAX是一个数字,它是在50-100之间:
case $MAX in ''|*[!0-9]*) echo "The value $MAX is not a number !" exit 1 ;; *) if [ $MAX -lt 50 ] || [ $MAX -gt 100 ] ;then echo "The value $MAX is not between 50-100" exit 1 fi echo "Looks like we are good !" ;; esac