2016-05-20 3 views
-1

Я не уверен, что случилось с моей Баш скрипт, как он не печатает заданные флаги, ни он повторяет их в случае заявления:Мой Баш скрипт не печатает флаги

26 while getopts ":a:b:p:u" opts; 
27 do 
28 case $opts in 
29  a) echo got an A flag;; 
30  b) echo got an B flag;; 
31  u) user=$OPTARGS echo $user;; 
32  p) pass=$OPTARGS echo $pass;; 
33  ?) echo I don\'t know what flag is this;; 
34 esac 
35 done 
36 
37 echo user: $user pass: $pass 

Это как Я назвал его:

bash-4.3$ ./functionexample.sh -p 123 -u mona 

ответ

0

Я получил его фиксированной благодаря помощи IRC Баш канала:

26 while getopts ":a:b:p:u:" opts; 
27 do 
28 case $opts in 
29  a) echo got an A flag;; 
30  b) echo got an B flag;; 
31  u) user=$OPTARG; echo $user;; 
32  p) pass=$OPTARG; echo $pass;; 
33  ?) echo I don\'t know what flag is this;; 
34 esac 
35 done 
36 
37 echo user: $user pass: $pass 
+1

Согласен, что с переменными не требуется цитирование. Но с эхом предлагается удвоить цитату, чтобы предотвратить нежелательное поведение. Рассмотрим строку 'variable = ', охватывающую две строки:' ',' echo $ variable' может не дать результат, который вы хотите, но 'echo' $ variable будет': будет :-) Я удалю нисходящий поток после внесения исправлений. – sjsam

+0

Я не спрашиваю вашу власть в bash, поскольку я уверен, что вы знаете, что делаете. Тестовый пример, который я указал, был вполне разумным в условиях вопроса, и я уверен, что это было бы полезно для будущего читателя. Нисходящая нить здесь не имеет большого значения, я уже уволил ее. ;) – sjsam

0

Это должно работать:

while getopts ":a:b:p:u" opts 
do 
    case $opts in #removed the dot at the end 
    a) echo "got an A flag";; 
    b) echo "got an B flag";; 
    u) user="$OPTARGS" 
     echo "$user" 
     #double quote the variables to prevent globbing and word splitting 
    ;; 
    p) pass="$OPTARGS" 
    #Passwords can contain whitespace in the beginning. 
    #If you don't double quote , you loose them while storing. 
    #eg. [email protected] will strip the leading whitespaces in the normal case. 
     echo "$pass" 
    ;; 
    ?) echo "I don't know what flag is this" 
    #Better double quote to make echo easy, consider something like \\\\\\ 
    #count the hashes? eh? 
    ;; 
    esac 
done 
+1

Цитата: * Не * необходимо при назначении переменных! – Camusensei

+0

Да, цитирование не требуется https://www.lynda.com/Bash-tutorials/Working-flags/142989/156661-4.html –

+0

Эхо в bash не является вообще-е. Этот отступ неправильный, какая точка вы удалили? Это не сработает: после «u» Давай! – Camusensei