我正在尝试使用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结尾。变量$MovieRes
是一个简单的列表,为每行显示1到1200之间的数字。根据值,case
决定应用哪个“案例”。
我想知道如何实际使用case
来实现这一点,因为在处理这样的范围时会有点混乱。
答案 0 :(得分:28)
在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
答案 1 :(得分:24)
bash case
语句不理解数字范围。它理解shell patterns。
以下内容应该有效:
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
但是,我建议您使用if-else语句并比较其他答案中的数字范围。 case
不是解决此问题的正确工具。这个答案仅供参考。
答案 2 :(得分:17)
只是为了根据你的意愿颠覆案件的乐趣,
你可以使用$((...))
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
答案 3 :(得分:1)
类似的问题可能对某人有用...随机附加的东西我刚尝试了它也检查它是一个整数,对我来说我希望它有一个预设值,让用户改变它,如果他们输入它设置为默认的错误数据。
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'检查变量是否在整数范围内的另一个例子:
检查$ 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
答案 4 :(得分:1)
我一直在寻找最简单的解决方案,却发现很难使用数字范围的 case语句。
最后,我找到了 zsh 的非常简单的解决方案:
#!/usr/bin/zsh
case "${var}" in
<0-5461>)
printf "${var} is between 0 and 5461"
;;
<5462-10922>)
printf "${var} is between 5462-10922"
;;
esac
和重击:
#!/bin/bash
case $((
(var >= 0 && var <= 5461) * 1 +
(var > 5462 && var <= 10922) * 2)) in
(1) printf "${var} is between 0 and 5461";;
(2) printf "${var} is between 5461 and 10922";;
esac
希望它可以帮助某人。