Подтвердить что ты не робот

Тестирование аргументов командной строки в bash

Я тестирую, чтобы первый аргумент моего script был --foo

if [ $# > 1 ]
then
    if [[ "$1" = "--foo" ]]
    then
        echo "foo is set"
        foo = 1
    fi
fi

if [[ -n "$foo"]]
then
    #dosomething
fi

Может ли кто-нибудь сообщить мне, что такое bash способ тестирования, если --foo присутствует как один из аргументов, не обязательно первый?

4b9b3361

Ответ 1

Вы должны использовать внешнюю утилиту getopt, если вы хотите поддерживать длинные параметры. Если вам нужно только поддерживать короткие варианты, лучше использовать Bash встроенный getopts.

Вот пример использования getopts (getopt не слишком отличается):

options=':q:nd:h'
while getopts $options option
do
    case $option in
        q  )    queue=$OPTARG;;
        n  )    execute=$FALSE; ret=$DRYRUN;; # do dry run
        d  )    setdate=$OPTARG; echo "Not yet implemented.";;
        h  )    error $EXIT $DRYRUN;;
        \? )    if (( (err & ERROPTS) != ERROPTS ))
                then
                    error $NOEXIT $ERROPTS "Unknown option."
                fi;;
        *  )    error $NOEXIT $ERROARG "Missing option argument.";;
    esac
done

shift $(($OPTIND - 1))

Не то, чтобы ваш первый тест всегда показывал результат true и создавал файл с именем "1" в текущем каталоге. Вы должны использовать (в порядке предпочтения):

if (( $# > 1 ))

или

if [[ $# -gt 1 ]]

или

if [ $# -gt 1 ]

Кроме того, для назначения вы не можете иметь пробелы вокруг знака равенства:

foo=1

Ответ 2

Как отметил Деннис, getopt и getopts - это стандартные способы анализа аргументов командной строки. Для альтернативного варианта вы можете использовать специальную переменную [email protected], которая расширяется до all аргументов командной строки. Итак, вы можете протестировать его с помощью шаблона в своем тесте:

#!/usr/bin/env bash

if [[ [email protected] == **foo** ]]
then
    echo "You found foo"
fi

Тем не менее, вам будет лучше, если вы выясните getopt раньше, чем позже.