вторник, 3 августа 2010 г.

Getopt и почему я с ним не подружился

Как вы уже поняли сегодняшнее повествование будет о моих неприятностях с getopt.

Случилась со мной необходимость скрипт написать который принмает на вход параметры в виде:

./script -a aaa bbb ccc -b aaa bbb ccc -c ... и т.п.

естественно количество этих самых "aaa bbb ccc" величина неизвествная


Первым делом кинулся я на изучение getopt и того как с ним работать. Как ни гуглил а способа получить список параметров для ключа я не нашел. Везде изымается ток один параметр.

Решил тогда я написать свою реализацию оного дела ибо скрипт нужен а сколько я еще потрачу на поиски способа уговорить getopt сделать то что мне надо - неизвестно.

Приветствуйте велосипед. только баш.. ну и немного седа.

function parseprm()
{
result=$1
shift
pn=$1
shift
ap=$*

while [ $(expr index "$ap" "-") != "0" ]
do
flet=${ap:$(expr index "$ap" "-"):1}
if [ "$flet" = "$pn" ]
then
ap=${ap:$(expr index "$ap" "-")}
if [ $(expr index "$ap" "-") = "0" ]
then
result=$(echo ${ap:1} | sed 's/^ *//;s/ *$//')
break
else
needlen=$(expr index "$ap" "-")
result=$(echo ${ap:1:$(expr $needlen - 2)} | sed 's/^ *//;s/ *$//')
break
fi
else
ap=${ap:$(expr index "$ap" "-")}
fi
done

echo $result
return 0
}

вызывать так
echo $(parseprm null b hhh jjj -a yyy fddfd -b fgg -c jjsl jjf)

где 'null' это параметр по умолчанию т.е. вернется если
нужной опции найти не получится

'b' - ключ без минуса для которого нужно получить параметры
ну и остальное непосредственно строка для разбора

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

З.Ы. тут код немножко уезжает за страничку.. править не буду
Upd: Исправил ошибку в седе для откусывания конечностей