2013-03-14 4 views
2

Я хочу написать инструмент командной строки, например git, который будет следовать стандартам POSIX. Он будет использовать такие опции, как --help или -h, --version ..etc. Но я не понимаю, как это сделать. Может ли кто-нибудь сказать мне, как это сделать, используя скрипты bash. Пожалуйста, помогите мне. Это для меня что-то очень новое.Как написать инструмент командной строки, используя bash

Пример: если имя моего инструмента является чек-кодом, тогда я хочу использовать инструмент типа;

Check-code --help 

или

Check-code --version 
+2

человек bash? или купить книгу? –

+1

http://stackoverflow.com/questions/8533029/bash-multiple-command-line-arguments-dependent-on-each-other?rq=1 –

ответ

0

Существует, вероятно, лучший способ сделать это, но вот что я нахожу полезным: Каждый аргумент представлен переменной в BASH. Первый аргумент - $1. Второй - $2 и т. Д. Сопоставьте строку опций с первым аргументом, и если она соответствует, запустите некоторый код соответственно.

Пример:

#!/bin/bash 
if [ $1 == "--hello" ] 
    then 
     echo "Hello" 
    else 
     echo "Goodbye" 
fi 

Если код в C или C++, а затем использовать переменную **argv. **argv - это двойной указатель, содержащий список всех аргументов, переданных программе (с argv[0] - имя программы).

+0

спасибо за ответ. Я думаю, мы можем использовать команду bash "getopt ". Можете ли вы предложить решение выше, используя это. Но я не знаю, работает ли он для форматов «-h» и «--help». – user1497818

+0

Если вы используете стиль оболочки Bourne 'test' (' ['), вы должны указать' '$ 1''. Использование '[[' не требует кавычек вокруг переменной (но все равно нужны кавычки вокруг литерала, содержащего пустое пространство). – cdarke

4

Насколько я знаю, «длинные варианты», такие как --help и --version, не являются стандартом POSIX, но стандартом GNU. Для служебных программ командной строки стандарт POSIX говорит:

Аргументы, состоящие из дефиса и отдельных букв или цифр, например «a», называются «опциями» (или исторически «флаги»).

Чтобы поддерживать короткие варианты опций POSIX, стоит познакомиться с getopts (есть учебники в Интернете), но он не поддерживает варианты GNU long.

Для длинных опций вы должны свернуть свой собственный:

filename=default 
while (($# > 0)) 
do 
    opt="$1" 
    shift 

    case $opt in 
    --help) 
     helpfunc 
     exit 0 
     ;; 
    --version) 
     echo "$0 version $version" 
     exit 0 
     ;; 
    --file) # Example with an operand 
     filename="$1" 
     shift 
     ;; 
    --*) 
     echo "Invalid option: '$opt'" >&2 
     exit 1 
     ;; 
    *) 
     # end of long options 
     break; 
     ;; 
    esac 

done 
+0

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

+0

@ user1497818: очень сложно, я не вижу способа использовать 'getopts' с длинными опциями.Возможно, вам лучше использовать Perl и 'Getopt :: Long' http://perldoc.perl.org/Getopt/Long.html – cdarke

+1

. Вы можете обнаружить один штрих в этом случае и передать $ opt и $ 1 (в случае, если есть аргумент опции) для getopts для его обработки. Единственным преимуществом является способность обрабатывать несколько однобуквенных опций, передаваемых в виде группы (например, -ine == -i -n -e). Я никогда не просил эту возможность для любого инструмента, который я написал, поэтому я никогда не беспокоился о его поддержке. – William

2

Вы можете использовать встроенную команду «getopts», например так:

#!/bin/bash 

# Parse arguments 
usage() { 
    echo "Usage: $0 [-h] [-v] [-f FILE]" 
    echo " -h Help. Display this message and quit. 
    echo " -v Version. Print version number and quit. 
    echo " -f Specify configuration file FILE." 
    exit 
} 

optspec="hvf:" 
while getopts "$optspec" optchar 
do 
    case "${optchar}" in 
     h) 
      usage 
      ;; 
     v) 
      version 
      ;; 
     f) 
      file=${OPTARG} 
      ;; 
     *) 
      usage 
      ;; 
    esac 
done 

это работает только для отдельных вариантов символов, а не для такие как -help или --help. На практике я никогда не обнаружил, что это существенное ограничение; любой скрипт, который достаточно сложный, чтобы требовать длинные варианты, вероятно, является тем, что я написал бы на другом языке.

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