Существует множество способов разбора аргументов в 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}
...