Задать вопрос
delch
@delch
Frontend developer

Как на bash'е организовать разбор аргументов и ключей?

К примеру я вызываю мой скрипт так:
MyPlugin header footer -c

Следовательно порядок и кол-во может быть любым. Footer и header это аргументы, а -c это ключ выполнения.
  • Вопрос задан
  • 6350 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
KEKSOV
@KEKSOV
Вам поможет getopts
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Посмотрите на libshflags
https://debian.pro/files/anlamp/mksite.sh - пример использования
https://code.google.com/p/shflags/ сама библиотека
Ответ написан
Комментировать
Если у скрипта появляются именованные параметры (опции) -- пора переходить с bash на более богатые структурами и библиотеками языки типа Perl, Python, Ruby. Проще отладка, поддержка, доработка.
Ответ написан
Комментировать
delch
@delch Автор вопроса
Frontend developer
Я в общем наворотил такой ад:
for val in $@
do
	loopIndex=$[loopIndex+1]
	if [ ! ${val:0:1} = "-" ]; then
		result=${args[$loopIndex]}
		arguments+=$result
	else
		echo "не соответствие"
	fi
done

Это я пытаюсь получить все аргументы скрипта, но при вызове в таком виде ./bedi.sh -r header footer
у меня echo $arguments выводит headerfooter слитно, словно это строка, хотя в самом начале я объявляю переменную arguments=()

В закрамах нашел такой вариант разбора аргументов и параметров
#!/bin/bash

showopts () {
  while getopts ":pq:" optname
    do
      case "$optname" in
        "p")
          echo "Option $optname is specified"
          ;;
        "q")
          echo "Option $optname has value $OPTARG"
          ;;
        "?")
          echo "Unknown option $OPTARG"
          ;;
        ":")
          echo "No argument value for option $OPTARG"
          ;;
        *)
        # Should not occur
          echo "Unknown error while processing options"
          ;;
      esac
    done
  return $OPTIND
}

showargs () {
  for p in "$@"
    do
      echo "[$p]"
    done
}

optinfo=$(showopts "$@")
argstart=$?
arginfo=$(showargs "${@:$argstart}")
echo "Arguments are:"
echo "$arginfo"
echo "Options are:"
echo "$optinfo"

Но он явно делает не массивы, а мне нужны массивы(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы