Вопрос по switch-statement, bash – Использование case для диапазона чисел в Bash
Я пытаюсь сделать следующее, используяcase
в Bash (в 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
чтобы достичь этого, так как это немного сбивает с толку при работе с такими диапазонами.
ones
упоминается здесь. Вы можете уточнить?
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 и сравнить диапазоны номеров, как в другом ответе.case
не правильный инструмент для решения этой проблемы. Этот ответ только для пояснительных целей.
которая может быть полезна для кого-то ... Случайная дополнительная вещь, которую я только что попробовал, где он также проверяет, что это целое число, для меня я хотел, чтобы оно имело предустановленное значение, позвольте пользователю изменить его, если они введут неправильный данные он устанавливает по умолчанию.
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