Использование getopt в Unix Shell - PullRequest
2 голосов
/ 27 сентября 2010

Мне нужно использовать скрипт Unix для передачи аргументов:

./Script.sh -c "abc" -d "def" -k "abc -d -c"

, где аргумент для:

  • -c = "abc"
  • -d = "def"
  • -k = "abc -d -c"

Как обрабатывать параметры в сценарии оболочки Uunix?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2010

Вот некоторые варианты обработки с использованием getopts:

#   -F          Final version (do not append date to version)
#   -s suffix   Add '-suffix' after version number
#   -V          Print version and exit
#   -h          Print help and exit
#   -j jdcfile  JDC file for project - required
#   -q          Quiet operation
#   -v          Verbose operation

arg0=$(basename $0 .sh)

usage()
{
    echo "Usage: $arg0 [-hqvFV] [-s suffix] -j jdcfile file.msd" 1>&2
    exit 1
}

error()
{
    echo "$0: $*" 1>&2
    exit 1
}

Fflag=
suffix=
jdcfile=
qflag=
vflag=no
while getopts FVhj:qs:v opt
do
    case "$opt" in
    (F) Fflag="-F";;
    (V) echo "Version information";;
    (h) echo "Help information";;
    (j) jdcfile="$OPTARG";;
    (q) qflag="-q";;
    (s) suffix="$OPTARG";;
    (v) vflag=yes;;
    (*) usage;;
    esac
done

shift $(($OPTIND - 1))

case $# in
(1) : OK;;
(*) usage;;
esac

if [ -z "$jdcfile" ]
then error "you did not specify which jdcfile to use (-j option)"
fi

Затем сценарий продолжается и выполняет свою задачу в соответствии с заданными параметрами. shift удаляет «потребляемые» опции, оставляя только аргументы имени файла.

1 голос
/ 29 ноября 2010

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

Параметр getopts более переносим,не все системы имеют расширенную версию GNU getopt.Например, Linux имеет расширенную версию GNU, а Mac OS X - нет.Оригинальная версия getopt не поддерживает пробелы.Несмотря на это ограничение, есть причина, по которой вы можете использовать расширенную версию GNU: она поддерживает длинные имена опций, а getopts - нет.

. Как использовать расширенную версию GNU getoptс пробелами.Важно использовать "$@" (используйте $ @ вместо $ * и убедитесь, что вокруг него заключены двойные кавычки) и eval всю команду set, чтобы все пробелы обрабатывались правильно.

eval set -- `getopt --long currdir:,dir:,argval:,verbose -o c:d:k:v -- "$@"`
while [ $# -gt 0 ]
do
    case "$1" in
    -c | --currdir)  CURRDIR="$2"; shift;;
    -d | --dir)      MYDIR="$2"; shift;;
    -k | --argval)   ARGVAL="$2"; shift;;
    -v | --verbose)  VERBOSE=yes;;
    esac
    shift
done
0 голосов
/ 27 сентября 2010

Есть команда getopts и программа getopt, хотя я считаю, что к тому времени, когда вам понадобится обрабатывать аргументы, вы переросли сценарии оболочки.

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

getopt разбивает ваши аргументы на флаги - отдохните, насколько я могу судить.

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