обработка аргументов с помощью getopts в конце строки


ia аватар

ia - Posted on 14 Ноябрь 2008

Бывает так, что нужно создать скрипт, при вызове которого дополнительные аргументы командной строки должны идти в конце. Например, чтобы

$ ./script action -o a -p -t argument

выполнял действие action, при этом обрабатывая аргументы -o -p -t, но при

$ ./script -o a -p -t action argument

выводил справку по использованию. (По такому принципу работает ряд утилит; в частности - многие распределённые системы контроля версий - git, mercurial, bazaar и т.п.)
Традиционно, для обработки аргументов используется утилита getopts; в Сети также можно без проблем найти множество примеров её использования.
Приблизительный пример же того, что нужно нам:

#!/bin/bash
#...
USAGE="script <action> <options> [file | directory]";
 
case "$1" in
	#обрабатываем действие, которое предусмотренно скриптом
	action1 | action2 ) action="$1" ;;
	#в противном случае выводим справку по использованию
	* ) echo "$USAGE"; exit 0 ;;
esac
 
shift $(($OPTIND)); #пропускаем обработанный первый аргумент
 
while getopts o:pt option; do
	#обработка допустимых опций
	case $option in
		o ) 
		case "$OPTARG" in
			#обработка значений аргумента -o
			a ) o_option="$OPTARG";;
			b ) o_option="$OPTARG";;
			* ) echo "Доступные значения для опции -o: a,b"; exit 0 ;;
		esac;;
		p ) p_option="true" ;;
		t ) t_option="true" ;;
		* ) echo "$USAGE"; exit 0 ;;
	esac
done
shift $(($OPTIND-1)); #пропуск всех обработанных опций и аргументов
#теперь "$1" содержит основной аргумент, а все опции и команды считаются обработанными
if [ "$1" == "$NULL" ]; then echo "$USAGE"; fi;
 
#тело скрипта
#...

Проверяем:

$ ./script.sh action1 -po a file
$ ./script.sh action file 
script <action> <options> [file | directory]
$ ./script.sh action1 -o 1 file
Доступные значения для опции -o: a,b
$ ./script.sh: option requires an argument -- o
script <action> <options> [file | directory]
$

Ну и так далее.
За дополнительной информацией просьба обращаться в google.

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.