Укажите аргументы командной строки, такие как пары имя = значение для сценария оболочки - PullRequest
2 голосов
/ 31 марта 2011

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

myscript action=build module=core

, а затем в моем сценарии получить переменную типа $action и обработать ее?

Я знаю, что $ 1 .... и т. Д. Можно использовать для получения переменных, но тогда это не будет значением имени, как пары.Даже если это так, то разработчик, использующий скрипт, должен позаботиться об объявлении переменных в том же порядке.Я этого не хочу.

Ответы [ 4 ]

6 голосов
/ 24 марта 2017

Это сработало для меня:

for ARGUMENT in "$@"
do

    KEY=$(echo $ARGUMENT | cut -f1 -d=)
    VALUE=$(echo $ARGUMENT | cut -f2 -d=)   

    case "$KEY" in
            STEPS)              STEPS=${VALUE} ;;
            REPOSITORY_NAME)    REPOSITORY_NAME=${VALUE} ;;     
            *)   
    esac    


done

echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"

Использование

bash my_scripts.sh  STEPS="ABC" REPOSITORY_NAME="stackexchange"

Консольный результат:

STEPS = ABC
REPOSITORY_NAME = stackexchange

ШАГИ и REPOSITORY_NAME готовы к использованию в скрипте.

Не имеет значения, в каком порядке находятся аргументы.

HTH

3 голосов
/ 31 марта 2011

В оболочке Bourne есть редко используемая опция '-k', которая автоматически помещает в среду любые значения, указанные как name=value в командной строке. Конечно, семейство оболочек Bourne / Korn / POSIX (включая bash) также делает это для name=value элементов перед именем команды:

name1=value1 name2=value2 command name3=value3 -x name4=value4 abc

При нормальном поведении POSIX-оболочки command вызывается с name1 и name2 в среде и с четырьмя аргументами. Под опцией оболочки -k Bourne (и Korn and bash, но не POSIX) она вызывается с name1, name2, name3 и name4 в среде и всего двумя аргументами. Страница справочника bash (как в man bash) не содержит эквивалента -k, но работает как оболочки Борна и Корна. Я не думаю, что когда-либо использовал это (опция -k) всерьез.

Из скрипта (command) невозможно сказать, что переменные среды были указаны исключительно для этой команды; они просто переменные окружения в среде этого скрипта.

Это самый близкий мне подход к тому, о чем вы просите. Я не думаю, что для семейства оболочек C существует что-то эквивалентное. Я не знаю другого анализатора аргументов, который устанавливает переменные из name=value пар в командной строке.


С некоторыми довольно серьезными предостережениями (это довольно легко сделать для простых значений, но трудно справиться со значениями, содержащими метасимволы оболочки), вы можете сделать:

case $1 in
(*=*) eval $1;;
esac

Это не семейство C shell. eval эффективно выполняет назначение оболочки.

arg=name1=value1
echo $name1
eval $arg
echo $name1
1 голос
/ 30 июля 2011
env action=build module=core myscript

Вы сказали, что используете tcsh. Для оболочек на основе Bourne вы можете отбросить "env", хотя оставлять его там безвредно. Обратите внимание, что это относится к оболочке, из которой вы запускаете команду, а не к оболочке, используемой для реализации myscript.

Если вы хотите, чтобы пары имя = значение следовали за именем команды, вам нужно будет поработать внутри myscript.

0 голосов
/ 03 февраля 2016

Если продолжить ответ Джонатана, это сработало для меня:

#!/bin/bash
if [ "$#" -eq "0" ]; then
  echo "Error! Usage: Remind me how this works again ..."
  exit 1
fi

while [[ "$#" > "0" ]]
do
  case $1 in
    (*=*) eval $1;;
  esac
shift
done
...