2013-03-16 6 views
0

Я пытаюсь использовать getopts на cygwin в сценарии bash. Ниже приведен код:Ошибки с использованием getopts на cygwin

#!/bin/bash 

# Sample program to deal with getopts. 

echo "Number of input arguments = $#"; 
i=0; 

while [ ${i} -lt 10 ]; 
do 
    i=$[${i}+1]; 
    echo ${i}; 
done 

while getopts ":a:b:c:e:" opt; 
do 
    case ${opt} in 
    a) 
    echo "-a was triggered with argument: ${OPTARG}"; 
    ;; 

    b) 
    echo "-b was triggered with argument: ${OPTARG}" 
    ;; 

    c) 
    echo "-c was triggered with argument: $[OPTARG}" 
    ;; 

    e) 
    echo "-e was triggered with argument: ${OPTARG}" 
    ;; 

    ?) 
    echo "Invalid argument: ${OPTARG}" 
    ;; 
    esac 
done 

Когда я запускаю приведенный выше код, я получаю следующее сообщение об ошибке:

./getOpts_sample.bash: line 37: syntax error near unexpected token `done' 
./getOpts_sample.bash: line 37: `done' 

Я не могу понять причину за этой ошибки. Почему цикл getopts не работает, пока первый делает? Это потому, что моя система не установлена ​​getopts? Как я могу это проверить?

ответ

2

Это не относится к cygwin; есть ошибка синтаксиса строка 26:

echo "-c was triggered with argument: $[OPTARG}" 

заменить [ с { и он будет работать.

Примечание для строки 11: echo ${i} неверно, используйте echo ${!i} для печати i-го аргумента.

Примечание для строки 10: синтаксис $[ ] в настоящее время устарел; Вы можете использовать (()) вместо так:

((i++)) 

или даже лучше, заменить строки 8-12 по:

for ((i=0; i<10; i++)); do echo ${!i}; done 
+0

Это отличный ответ, я хотел бы дать ему больше, чем один upvote! – ruakh

+0

Спасибо за это! Я думаю, мне нужен сон. Я не вижу код правильно. – Sriram