2017-02-11 2 views
2

Мне интересно, можно ли написать сценарий оболочки с параметрами, используя getopt или getopts, что не позволит объединить несколько параметров?Сценарий оболочки с одним вариантом выбора

Например, мой сценарий может быть побежал в двух возможных режимах - длинные или короткие и с альфа или бета-вариантов, поэтому я хотел бы использовать ./script.sh -l -a, ./script.sh -l -b или ./script.sh -s -a, ./script.sh -s -b, но это не должно быть возможно запускать оба варианта -l и -s или -a и -b в то же время.

Я знаю, что это можно сделать намного проще, потому что я могу сделать option -a, который будет работать long version alpha, option -b который будет работать long version beta, option -c который будет работать short version alpha и option -d, который будет работать short version beta, но я хочу использовать два варианта , просто поймите, возможен ли такой способ.

Ниже Вы найдете код с «варианты», чтобы выбрать, используя простой read, что я хочу, чтобы преобразовать в getopt(s)

#!/bin/bash 
echo "Please insert the text:" 

read text 

echo 

echo "You entered $text" 

echo "Choose version: 

1) Long 
2) Short 
3) Quit 
-> " 

read option 

# OPTION 1 

if [ "$option" == "1" ]; then 

echo "Choose method: 

1) alpha 
2) beta" 

read method 

# METHOD 1 

if [ "$method" == "1" ]; then 

longalpha 

fi 

# METHOD 2 

if [ "$method" == "2" ]; then 

longbeta 

fi 

fi 

#OPTION 2 

if [ "$option" == "2" ]; then 

echo "Choose method: 

1) alpha 
2) beta" 

read method2 

# METHOD 1 

if [ "$method2" == "1" ]; then 

shortalpha 

fi 

# METHOD 2 

if [ "$method2" == "2" ]; then 

shortbeta 

fi 

fi 

if [ "$option" == "3" ]; then 

echo "Good Bye!" 

fi 
+0

Нужно ли присутствовать либо '-l', либо' -s', и должны ли они оба быть первым параметром, если они используются? – Fred

+0

Любой из них должен представлять, и не имеет значения, является ли это первым параметром, который используется или нет. Сценарий не должен работать, пока есть опция '-l' или' -s', там должно быть '-l -a' /' -l -b'/'-s -a' /' -s -b '. Насколько я знаю (я только начинаю свое путешествие с обхода оболочки), 'getopt' или' getopts' запускают отдельные опции в коде один за другим, но я хочу запустить script1, если есть '-l - a', script 2, если есть '-l -b', сценарий 3, если есть' -s -a', скрипт 4, если есть '-s -b' –

+0

@KoahNuttler: имеет значение порядок? '-a -l' недействителен? просто для подтверждения – Inian

ответ

1

Вы должны проанализировать все варианты первой, и установить переменные, указывающие которые прошли и которые не имею.

Затем, перед выполнением чего-либо, проверьте, отсутствуют ли как -l, так и -s, и если они выходят с соответствующим сообщением об ошибке.

Вы можете выполнить аналогичную проверку с -a и -b

После того, как вы знаете, у вас есть все, что нужно, но ничего больше, то вы не можете иметь свой скрипт выполнить соответствующую операцию.

+1

Было бы полезно показать нам код, как вы может сделать это. В его нынешнем виде это просто _comment_ – Inian

+1

Проблема OP, похоже, не в том, как писать рабочий код (в вопросе нет кода, работающего или не работающего), что затрудняет предоставление соответствующего примера кода), проблема похоже, определяет правильный подход для кодирования желаемого поведения. Вот почему я описал идею, а не писал фактический код. – Fred

+0

Чтобы быть понятным, что я имею в виду, это может сделать лучший ответ на предоставление кода, который OP может копировать и вставлять со стандартами SO, но в случае, когда речь идет о логическом подходе к желаемому результату, предлагая подход без код может, на мой взгляд, представлять собой ответ, а не комментарий. – Fred

0

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

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

unset vers meth 

И вы также справочную таблицу для флагов на действия, как:

declare -A flags=([l]=long [s]=short [a]=alpha [b]=beta) 

Затем вы можете запустить getopts как:

while getopts "lsab" opt; do 
    case $opt in 
     (l|s) [[ $vers ]] && fail  # we already set $vers 
       vers=${flags[$opt]} ;; 
     (a|b) [[ $meth ]] && fail  # we already set $meth 
       meth=${flags[$opt]} ;; 
     ('?') fail ;;     # we got some unknown option 
    esac 
done 

Единственное, что вновь сети, чтобы проверить, что мы получили что-то для $vers и $meth:

[[ $vers && meth ]] || fail 

И затем выполнить задание:

$vers$method 

То, как вы справиться с этой последней части зависит от специфики вашего код, но так как вы звоните shortalpha и т. д., этот способ подходит.Если вы вместо этого вызываете какой-то внешний код, это может быть как prog --$vers --$meth и т. Д.