Вопрос по switch-statement, bash – Использование case для диапазона чисел в Bash

21

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

& quot; Но так или иначе, многие из них & quot; ... я не совсем уверен, какойones упоминается здесь. Вы можете уточнить? Jeremy J Starcher

Ваш Ответ

4   ответа
24

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 не правильный инструмент для решения этой проблемы. Этот ответ только для пояснительных целей.

Ответ IMO kev должен быть принят, потому что это то, что вы (и все, кто заходит на этот сайт) должны использовать. Но я бы не против +1! Спасибо :)
Спасибо, собачья будка. Теперь вот проблема, вы ответили правильно, ответили на то, что я искал, но, как вы также упомянули, это не будет правильным способом сделать это. Правильный / более простой способ состоит в том, чтобы использовать ответ Кева. Должен ли я: 1. Принять ваш ответ как правильный ответ и дать Кеву +1 или 2. Должен ли я принять ответ Кева как правильный и дать вам +1. Я спрашиваю, так как вы оба как-то отвечаете правильно. Luis Alvarado
28

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
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
0

которая может быть полезна для кого-то ... Случайная дополнительная вещь, которую я только что попробовал, где он также проверяет, что это целое число, для меня я хотел, чтобы оно имело предустановленное значение, позвольте пользователю изменить его, если они введут неправильный данные он устанавливает по умолчанию.

    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

Похожие вопросы