LINUX.ORG.RU

Bash: парсинг параметров

 ,


0

3

Неужели за долгие долгие долгие... ГОДА. В баше так и не сделали нормальный парсинг аргументов из КОРОБКИ? Неужели нужно вечно страдать, втыкать в каждый файлик лапшу из ИИ гугла одну и ту же?

while [[ "$#" -gt 0 ]]; do
    case "$1" in
        -o|--output)
            output_file="$2"
            shift # Consume the argument's value
            ;;
        -v|--verbose)
            verbose=true
            ;;
        -i|--input)
            input_value="$2"
            shift # Consume the argument's value
            ;;
        *)
            echo "Unknown parameter: $1"
            exit 1
            ;;
    esac
    shift # Consume the current argument (flag or unknown)
done


с этими корявыми закорючками, которые никогда не запомнишь?

Вот это вообще что такое?

while [[ "$#" -gt 0 ]]; do


Я до сих пор не могу это понять интуитивно. Кто это вообще придумывал такой синтаксис? Что он ел? Что пил?

;;

Зачем делать 2 точки с запятой?

★★★★

Последнее исправление: gobot (всего исправлений: 2)

ИМХО грамотно написано, я после нескольких лет написания автоматизации к такому пришел.

Вот это вообще что такое?

$# количество аргументов, каждый вызов shift удаляет один аргумент, таким образом происходит проход по аргументам.

anonymous
()
while getopts ":hs:i:l:p:n" opt; do
  case "$opt" in
  h) usage ;;
  s) SERVER=$OPTARG ;;
  i) INDEX=$OPTARG ;;
  l) LOGIN=$OPTARG ;;
  p) PASSWD=$OPTARG ;;
  n) ADDITIONAL="--silent" ;;
  :) echo "Опция -$OPTARG требует аргумента" >&2; usage ;;
  \?) echo "Неизвестная опция -$OPTARG" >&2; usage ;;
  esac
done

shift "$((OPTIND-1))"   # убираем уже разобранные параметры

if [ "$SERVER" = "" ] || [ "$INDEX" = "" ] || [ "$LOGIN" = "" ] || [ "$PASSWD" = "" ]; then
  echo "Set required arguments"
  usage
fi

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 3)
Ответ на: комментарий от gobot

неужели за столько лет нельзя написать какую то функцию, эти параметры ведь в каждом скрипте используется

Спорю что какой-то упорыш, который как и ты не понимает что стоит писать на баше а что нет, это таки написал - поищи на каких-нибудь awesome bash помойках.

А в самом баше этого нет и никогда не будет, потому что на нём нормальные люди никогда не станут писать то что требует разбора аргументов.

anonymous
()
Ответ на: комментарий от anonymous

Ой да ладно, часто нужны скрипты примитивные, куча скриптов для управления проектом и с параметрами и без. Ну а что, если не баш? Он везде есть. На питоне, на ноде или пхп что ли, ну скажи еще что на Ц

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

куча скриптов для управления проектом и с параметрами и без.

Makefile, из новомодных – just

Ну а что, если не баш? Он везде есть.

нет на винде, маке, бздях и еще кое-где

На питоне, на ноде или пхп что ли

а у этих с переносимостью сильно лучше

anonymous
()
Ответ на: комментарий от gobot

неужели за столько лет нельзя написать какую то функцию, эти параметры ведь в каждом скрипте используется…

Это вопрос к самому себе.

Каждый новый скрипт начинается с функции:

arg_parse()
{	# arg_parse	21
  [ "$#" = '0' ] && usage && exit 0
  [ "$#" = '1' ] && case ${1} in
		  --version|-v)	echo "$(basename "$0") ${version}"; exit 0;;
		  *)	;;
		esac
  for i; do
	case ${i} in
	  --arch=*)	arch="${i#--arch=} ${arch}";;
	  --dest=*)	dest=${i#--dest=};;
	  -i=*)		icon=${i#-i=};;
	  --icon=*)	icon=${i#--icon=};;
	  -l=*)		lng=${i#-l=};;
	  --lng=*)	lng=${i#--lng=};;
	  --log)	msg='0'; msg_svc='log';;
	  --log=*)	msg=${i#--log=}; msg_svc='log';;
	  --notify)	msg='0'; msg_svc='notify';;
	  --notify=*)	msg=${i#--notify=}; msg_svc='notify';;
	  --speech)	msg='0'; msg_svc='speech';;
	  --speech=*)	msg=${i#--speech=}; msg_svc='speech';;
	  --src=*)	src=${i#--src=};;
	  --std)	msg='0'; msg_svc='std';;
	  --std=*)	msg=${i#--std=}; msg_svc='std';;
	  -u=*)		util=${i#-u=};;
	  --util=*)	util=${i#--util=};;
	  -v=*)		version=${i#-v=};;
	  --version=*)	version=${i#--version=};;
	  --)		;;
	  *)	if [ -n "${opt}" ]; then opt="${opt} ${i}"; else opt="${i}"; fi;;
	esac
  done
}

Скопировал, вставил, ненужное убрал, нужное по шаблону добавил. Помимо парсинга, при запуске без параметров выводит ‘Usage: …’ (тоже функция), с одним параметром ‘–version’ - показывает версию.

andytux ★★★★★
()
Последнее исправление: andytux (всего исправлений: 1)