Используя случай для диапазона чисел в Bash
Я пытаюсь сделать следующее, используя case
в Bash (в Linux).
Если X находится между 460 и 660, выводите информацию X.
Если X находится между 661 и 800, сделайте что-нибудь еще.
Etc.
Сейчас это то, что у меня есть:
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
, чтобы выполнить это, так как это немного запутывает при работе с такими диапазонами.
Ответы
Ответ 1
В 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
Ответ 2
Оператор 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
Тем не менее, я бы рекомендовал использовать оператор if-else и сопоставить диапазоны чисел, как в другом ответе. A case
не подходит для решения этой проблемы. Этот ответ предназначен только для пояснения.
Ответ 3
Просто для удовольствия дела подрезания, чтобы делать то, что вы хотите,
вы можете использовать $((...))
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
Ответ 4
Подобная проблема, которая может быть полезной для кого-то... Случайная дополнительная вещь, которую я просто опробовал, где он проверяет, что это целое число, для меня я хотел, чтобы у него было заданное значение, пусть пользователь меняет его, если они введите неверные данные, которые он устанавливает по умолчанию.
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
}
Другой пример, использующий "случай", чтобы проверить, что переменная находится в диапазоне целых чисел:
проверьте, что $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