2013-10-07 3 views
2

Можно ли сделать что-то вроде следующего (и как?) (, Соответственно, почему нет.?):Использование переменных с несколькими вариантами в случае заявления

MATCH="--opt1 | --opt2" 
while true ; do 
    case $1 in 
     $MATCH) 
      echo "option $2" found; 
      shift 2;; 
     *) 
      unknown option; exit 1; 
    esac 
done 

По причине я не понимаю, это не работает. Однако наличие только одной альтернативы, такой как MATCH = "- opt1", является прекрасным.

Edit 1: Возможное решение

Вместо того, чтобы идти с сазе можно было бы просто проверить, если данный вариант имеет место в череде множества доступных параметров, например, с помощью Grep и если. Для того, чтобы сделать это полным динамически один могло бы рассмотреть follwoing решения о, который может также в сочетании с или внедренным в сазе:

while true ; do 
if [ -n "$(echo $MATCHES|grep -- $1)" ]; then 
    echo "found option $1 with value $2" 
    shift 2 
fi 
done 

ответ

9

Трубы характер, при встраивании в качестве значения параметра, трактуются буквально, а не как синтаксис. Вам нужно будет использовать несколько строк:

while true; do 
    case $1 in 
     $MATCH1 | $MATCH2) 
     # etc 
+0

Хорошо. Таким образом, он соответствует только указанному параметру точно '' --opt1 | --opt2 "' – fedorqui

+0

, что означает, что «Матч-предложение» не может быть создан в целом?! – user1240076

+0

@ user1240076 Правильно. Ваш код становится более четким, если вы сохраняете данные и синхронизаторы/операторы отдельно. – chepner

Смежные вопросы