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

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

Ваш Ответ

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

Спасибо, собачья будка. Теперь вот проблема, вы ответили правильно, ответили на то, что я искал, но, как вы также упомянули, это не будет правильным способом сделать это. Правильный / более простой способ - использовать Kev 'ответ. Должен ли я: 1. Принять ваш ответ как правильный ответ и дать Кеву +1 или 2. Должен ли я принять ответ Кева как правильный и дать вам +1. Я спрашиваю, так как вы оба как-то отвечаете правильно. Luis Alvarado
ИМО кевьОтвет должен быть принят, потому что это то, что вы (и все, кто заходит на этот сайт) должны использовать. Но я бы нене против +1! Спасибо :) dogbane
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
Спасибо, что нашли способ указать числовые диапазоны вcase утверждение, а не просто предположить, что это должно бытьif, :-) roens

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