2016-08-29 8 views
0

Я хочу передать 3 параметра с getopts в свой скрипт оболочки. Скрипт требует, по крайней мере, первых 2, третий параметр является необязательным. Если он не установлен, используется его значение по умолчанию. Так что следующий будет как работа:Как передать в командной строке обязательные и необязательные флаги в командной строке с помощью getopts?

sh script.sh -a "/home/dir" -b 3 
sh script.sh -a "/home/dir" -b 3 -c "String" 

Я попытался сделать это как следующий, но она постоянно игнорирует мои введенные параметры.

usage() { 
echo "Usage: Script -a <homedir> -b <threads> -c <string>" 
    echo "options:" 
       echo "-h  show brief help" 

    1>&2; exit 1; 
} 

string="bla" 

while getopts h?d:t:a: args; do 
case $args in 
    -h|\?) 
     usage; 
     exit;; 
    -a) homedir=d;; 
    -b) threads=${OPTARG};; 
    -c) string=${OPTARG} 
     ((string=="bla" || string=="blubb")) || usage;; 
    :) 
     echo "Missing option argument for -$OPTARG" >&2; exit 1;; 
    * ) 
     echo "Unimplemented option: -$OPTARG" >&2; exit 1;; 
    esac 
done 

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

Я действительно хотел бы помочь вам здесь. Спасибо :)

+0

Вы посмотрели на значение '$ args' внутри цикла while? В учебнике [getops tutorial] (http://wiki.bash-hackers.org/howto/getopts_tutorial) есть хорошая информация; возможно, вам стоит сначала проверить их. – larsks

ответ

3

У вас есть несколько ошибок в вашем скрипте. Самое главное, что $args содержит только букву опциона, без ведущей черты. Также строка опций, которую вы давали getopts(), не соответствует возможностям, которые вы на самом деле обрабатываете (h, ?, a, b, c). Вот скорректированная версия цикла:

while getopts "h?c:b:a:" args; do 
case $args in 
    h|\?) 
     usage; 
     exit;; 
    a) homedir=d;; 
    b) threads=${OPTARG};; 
    c) string=${OPTARG} 
     echo "Entered string: $string" 
     [[ $string=="bla" || $string=="blubb" ]] && usage;; 
    :) 
     echo "Missing option argument for -$OPTARG" >&2; exit 1;; 
    * ) 
     echo "Unimplemented option: -$OPTARG" >&2; exit 1;; 
    esac 
done 
+0

Большое спасибо – Momina

+0

Вы можете подумать о том, чтобы отметить ответ как «правильный», если он решил вашу проблему. –