аргументы сценария оболочки не позиционные - PullRequest
3 голосов
/ 10 июня 2011

Есть ли способ передать непозиционные аргументы в сценарий оболочки? Смысл явно указывать какой-то флаг?

. myscript.sh value1 value2
. myscript.sh -val1=value1 -val2=value2

Ответы [ 5 ]

4 голосов
/ 10 июня 2011

Вы можете использовать getopts, но мне это не нравится, потому что его сложно использовать и он не поддерживает длинные имена опций (в любом случае, это не версия POSIX).

Я рекомендую не использовать переменные окружения. Существует слишком большой риск столкновения имен. Например, если ваш сценарий реагирует по-разному в зависимости от значения переменной среды ARCH и выполняет другой сценарий, который (без вашего ведома) также реагирует на переменную среды ARCH, то у вас, вероятно, есть сложный найти ошибку, которая появляется только изредка.

Это шаблон, который я использую:

#!/bin/sh

usage() {
    cat <<EOF
Usage: $0 [options] [--] [file...]

Arguments:

  -h, --help
    Display this usage message and exit.

  -f <val>, --foo <val>, --foo=<val>
    Documentation goes here.

  -b <val>, --bar <val>, --bar=<val>
    Documentation goes here.

  --
    Treat the remaining arguments as file names.  Useful if the first
    file name might begin with '-'.

  file...
    Optional list of file names.  If the first file name in the list
    begins with '-', it will be treated as an option unless it comes
    after the '--' option.
EOF
}

# handy logging and error handling functions
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$*"; exit 1; }
usage_fatal() { error "$*"; usage >&2; exit 1; }

# parse options
foo="foo default value goes here"
bar="bar default value goes here"
while [ "$#" -gt 0 ]; do
    arg=$1
    case $1 in
        # convert "--opt=the value" to --opt "the value".
        # the quotes around the equals sign is to work around a
        # bug in emacs' syntax parsing
        --*'='*) shift; set -- "${arg%%=*}" "${arg#*=}" "$@"; continue;;
        -f|--foo) shift; foo=$1;;
        -b|--bar) shift; bar=$1;;
        -h|--help) usage; exit 0;;
        --) shift; break;;
        -*) usage_fatal "unknown option: '$1'";;
        *) break;; # reached the list of file names
    esac
    shift || usage_fatal "option '${arg}' requires a value"
done
# arguments are now the file names
3 голосов
/ 10 июня 2011

Проще всего передать их как переменные окружения:

$ val1=value1 val2=value2 ./myscript.sh

Это не работает с вариантами csh, но вы можете использовать env, если вы используете такую ​​оболочку.

2 голосов
/ 11 июня 2011

Пример:

#!/bin/bash
while getopts d:x arg
do
        case "$arg" in
                d) darg="$OPTARG";;
                x) xflag=1;;
                ?) echo >&2 "Usage: $0 [-x] [-d darg] files ..."; exit 1;;
        esac
done
shift $(( $OPTIND-1 ))

for file
do
        echo =$file=
done
2 голосов
/ 10 июня 2011

Да, есть. Зовут getopts http://www.mkssoftware.com/docs/man1/getopts.1.asp

0 голосов
/ 20 сентября 2012

Сценарий имеет следующие аргументы: - $ 0 - название скрипта - $ 1, $ 2, $ 3 .... - полученные аргументы $ * = все аргументы, $ # = количество аргументов

Ссылка: http://famulatus.com/ks/os/solaris/item/203-arguments-in-sh-scripts.html

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