2016-02-08 2 views
1

Рассмотрим простой Баш фрагмент:Неограниченный выбор в случае заявления BASH

case $OPTION in 
    1) 
    IMAGE=${options[0]%.tar} 
    ;; 
    2) 
    IMAGE=${options[1]%.tar} 
    ;; 
    3) 
    IMAGE=${options[2]%.tar} 
    ;; 
    4) 
    IMAGE=${options[3]%.tar} 
    ;; 
    *) 
    echo "invalid option" 
    exit 1 
esac 

В моем реальном сценарии число идет до 30, что делает его довольно долго. Могу ли я как-то указать случаи с переменной?

Что-то вроде этого:

case $OPTION in 
    $i) 
    IMAGE=${options[$(($i-1))]%.tar} 

Любой указатель высоко ценится.

+0

Хорошо, что случилось, когда вы попробовали? –

ответ

3

можно сопоставить с несколькими шаблонами в одном предложении:

case $OPTION in 
    1|2|3: 
     echo "$OPTION is one, two or three" 
     ;; 
esac 

, если это все еще слишком много типирование для вас, вы можете использовать некоторые простые сопоставления с образцом:

case $OPTION in 
    # the following matches 
    # - single-digit numbers 0-9 
    # - two-digit numbers starting with either 1 or 2 
    # - the number 30 
    [0-9]|[12][0-9]|30) 
    IMAGE=${options[$(($OPTION-1))]%.tar} 
    ;; 
    *) 
    echo "invalid option" 1>&2 
    exit 1 
esac 
3

Ой, DRY:

if ((1 <= OPTION && OPTION <= 30)); then 
    IMAGE=${options[OPTION-1]%.tar} 
else 
    echo "invalid option" >&2 
    exit 1 
fi 
+0

не должно быть '1

+0

пусть evalautes арифметические и восьмеричные, хотя и такие вещи, как '034', будут действительны, хотя я считаю маловероятным, что это желательно OP. – 123

+0

@ 123, мы можем исправить это с помощью '10 # $ OPTION' вместо –