Разбор аргументов сценария оболочки - PullRequest
9 голосов
/ 03 февраля 2011
$myscript.sh -host blah -user blah -pass blah

Я хочу передать в него аргументы.

Я привык делать $1, $2, $3 .... но я хочу начать называть их

Ответы [ 4 ]

15 голосов
/ 03 февраля 2011

Существует множество способов разбора аргументов в sh. Гетопт это хорошо. Вот простой скрипт, который разбирает вещи вручную:

#!/bin/sh
# WARNING: see discussion and caveats below
# this is extremely fragile and insecure

while echo $1 | grep -q ^-; do
    # Evaluating a user entered string!
    # Red flags!!!  Don't do this
    eval $( echo $1 | sed 's/^-//' )=$2
    shift
    shift
done

echo host = $host
echo user = $user
echo pass = $pass
echo args = $@

Примерный прогон выглядит так:

$ ./a.sh -host foo -user me -pass secret some args
host = foo
user = me
pass = secret
args = some args

Обратите внимание, что это даже отдаленно не надежно и широко открыто для безопасности дыры, так как скрипт eval - это строка, созданная пользователем. Это просто предназначено служить примером для одного возможного способа сделать вещи. Более простой способ - потребовать от пользователя передачи данных в среде. В оболочке bourne (т. Е. Всё, что не входит в семейство csh):

$ host=blah user=blah pass=blah myscript.sh

прекрасно работает, и в сценарии будут доступны переменные $host, $user, $pass.

#!/bin/sh
echo host = ${host:?host empty or unset}
echo user = ${user?user not set}
...
9 голосов
/ 03 февраля 2011
7 голосов
/ 03 февраля 2011

Вот простой способ обработки длинных и коротких опций:

while [[ $1 == -* ]]; do
    case "$1" in
      -h|--help|-\?) show_help; exit 0;;
      -v|--verbose) verbose=1; shift;;
      -f) if (($# > 1)); then
            output_file=$2; shift 2
          else 
            echo "-f requires an argument" 1>&2
            exit 1
          fi ;;
      --) shift; break;;
      -*) echo "invalid option: $1" 1>&2; show_help; exit 1;;
    esac
done

С Как мне легко обрабатывать аргументы командной строки (опции) в моем скрипте?

0 голосов
/ 14 марта 2014

Я принимаю приведенный выше пример Уильяма Перселла (с советом Денниса Уильямсона) для параметров в этом формате: script -param1 = value1 -param2 = value2 ...

Вот код с анализатором аргументов в одну строку (сохранитьэто в файле 'script'):

#!/bin/bash

while echo $1 | grep ^- > /dev/null; do declare $( echo $1 | sed 's/-//g' | sed 's/=.*//g' | tr -d '\012')=$( echo $1 | sed 's/.*=//g' | tr -d '\012'); shift; done

echo host = $host
echo user = $user
echo pass = $pass

Вы называете это так:

script -host=aaa -user=bbb -pass=ccc

и результат равен

host = aaa
user = bbb
pass = ccc

Кто-нибудь знает более короткий код для разбора аргументов, чем этот?

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