Улучшить проверку аргументов - PullRequest
1 голос
/ 02 октября 2009

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

Usage:  flipfile [OPTION] inputfile outputfile


Options:
-f  Force. Accept ANY inputfile, not just regular files.

И мой текущий код проверки:

if [ $# -eq 2 ]; then
        infile=$1
        outfile=$2
elif [ $# -eq 3 -a $1 = "-f" ]; then
        option=$1
        infile=$2
        outfile=$3
else
        echo -e "Error. Usage:  flipfile [OPTION] inputfile outputfile\n\n"
        echo -e "Options:\n-f\tForce. Accept ANY inputfile, not just regular files."
        exit 1
fi

Проверка работает. Но так как я делаю это для развлечения и для обучения, я ценю любые советы, которые могут помочь мне написать более чистые скрипты Bash.

Как бы вы улучшили этот код проверки? Используйте getopt или getopts, если считаете, что это правильное решение. Я хочу, чтобы дополнительный аргумент -f был первым аргументом. Если вы думаете, что [[ conditional-expression ]] чище, чем у меня, смело изменяйте это тоже. Я приму ответ, который я считаю самым чистым.

Ответы [ 2 ]

2 голосов
/ 02 октября 2009

Это хороший стартовый шаблон - его легко распространить на другие параметры и легко иметь разные возможности для разного числа аргументов.

#!/bin/bash

exit_usage() {
    echo -e "Usage: flipfile [option] inputfile outputfile"
    exit 1
}

while getopts "f" opt; do
    case $opt in 
        f ) force=1;;
        * ) exit_usage;;
    esac
done
shift $((OPTIND-1))

case $# in
    2 ) infile=$1
        outfile=$2;;
    * ) exit_usage;;
esac

<actual script>
0 голосов
/ 03 октября 2009

Я думаю Ответ Джефроми очень хороший. Даже если это исключит все ваши if утверждения, я прокомментирую ту часть вашего вопроса, которая относится к ним.

В Bash двойная скобка позволяет намного более чистый синтаксис, который больше похож на некоторые другие языки. Вы можете избежать экранирования скобок и большинства цитат. Операторы сравнения проще. Доступны некоторые операторы, которые [ не предлагает, такие как сопоставление с шаблоном в стиле подстановочных знаков и сопоставление с регулярным выражением. Он использует && и || для "и" и "или" и ! для "не". Используйте его для строк и файлов.

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

if [[ ( $v1 > 42 && $v2 == $v3 ) || ( $v4 != $(cmnd $(mk-arg-cmnd)) && v5 =~ ^-?[[:digit:]]+$ ]]

Если вы сравниваете числа, используйте двойные скобки:

if (( $i >= $number + $other ))

Подробнее см. на этой странице .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...