инструменты bash для разбора аргументов - PullRequest
3 голосов
/ 17 мая 2010

У меня есть скрипт bash, который использует несколько переменных (назовите их $foo и $bar). Прямо сейчас скрипт определяет их в верхней части с жестко закодированными значениями, такими как:

foo=fooDefault
bar=barDefault

....

# use $foo and $bar

То, что я хочу, - это возможность использовать скрипт, как любой из этих:

myscript              # use all defaults
myscript -foo=altFoo  # use default bar
myscript -bar=altBar  # use default foo
myscript -bar=altBar -foo=altFoo

Идеальное решение позволило бы мне просто перечислить переменную, для которой я хочу проверить флаги.

Есть ли достаточно хороший способ сделать это?


Я видел getopt, и я думаю, что это может сделать около 70% того, что я ищу, но мне интересно, есть ли инструмент или индий, который строится на нем как то получает остальное.

1 Ответ

1 голос
/ 17 мая 2010

Вы можете использовать eval, чтобы сделать что-то близкое:

foo=fooDefault
bar=barDefault

for arg in "$@"; do
    eval ${arg}
done

Эта версия не работает с ведущей чертой, поэтому вы можете запустить ее как:

myscript foo=newvalue

Тем не менее, пара слов предостережения. Поскольку мы используем eval, вызывающий может вставить любой код / ​​данные, которые они хотят, в ваш скрипт. Если вам нужен безопасный код, вам нужно будет подтвердить ${arg}, прежде чем eval его.

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

myscript foo='"with sapces"'
...