Подтвердить что ты не робот

Используя случай для диапазона чисел в 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, чтобы выполнить это, так как это немного запутывает при работе с такими диапазонами.

4b9b3361

Ответ 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