27

caseBash(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このような範囲を扱うと少し混乱するので、これを達成するために実際に使用する方法を知りたいです。

4

5 に答える 5

38

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
于 2012-09-27T04:48:20.727 に答える
33

bashcaseステートメントは数値範囲を認識しません。シェルパターンを理解します。

以下が機能するはずです。

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 ステートメントを使用して、他の回答のように数値範囲を比較することをお勧めします。Acaseは、この問題を解決する適切なツールではありません。この回答は、説明のみを目的としています。

于 2012-09-27T08:02:19.987 に答える
2

誰かに役立つかもしれない同様の問題...整数であることもチェックするところを試してみたランダムな追加のことです。デフォルトに設定するデータ。

    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

    }

'case' を使用して、変数が整数の範囲内にあるかどうかを確認する別の例:

$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
于 2014-01-24T14:54:54.780 に答える