LINUX.ORG.RU

Ъ-проверка параметров.

 


0

2

Как Ъ определяют, что программа на bash запущена с определенным параметром (причем, имеющим короткую и длинную формы:

# Вариант 1
script.sh --profile="/ur/share/icons"
# Нужно: 1 - определить, что такой параметр был, 2 - получить значение "/usr/share/icons"

# Вариант 2
script.sh -p "/usr/share/icons"
# Определить нужно то же самое.

Как Ъ без быдлокода делают такие проверки?

Ответ на: комментарий от const86

Отлично, с коротким разобрался, спасибо, а что насчет длинного?

#!/bin/bash
 
while getopts ":a:" opt; do
  case $opt in
    a)
      echo "-a was triggered, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done
AlexCones ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

что мешает использовать туже реализацию?

Знак «=»?

AlexCones ★★★
() автор топика
Ответ на: комментарий от backbone
-t|--target) [ $targets_changed == false ] && REP_TARGETS="" && targets_changed=true; REP_TARGETS="$REP_TARGETS $2"; shift 2 ;;
--cflags) [ $cflags_changed == false ] && REP_CFLAGS="" && cflags_changed=true; REP_CFLAGS="$REP_CFLAGS $2"; shift 2 ;;
--cxxflags) [ $cxxflags_changed == false ] && REP_CXXFLAGS="" && cxxflags_changed=true; REP_CXXFLAGS="$REP_CXXFLAGS $2"; shift 2 ;;
--ldflags) [ $ldflags_changed == false ] && REP_LDFLAGS="" && ldflags_changed=true; REP_LDFLAGS="$REP_LDFLAGS $2"; shift 2 ;; 

Т.е. получается, что bash даже в случае разделения параметров знаком «=» будет видеть их как два разных параметра?

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

getopt разделяет все параметры пробелом. set задаёт их в качестве входных аргументов скрипта.
Bash, насколько понимаю, не будет понимать '=' как символ разделитель в параметрах, даже при явном указании IFS==.

backbone ★★★★★
()
Ответ на: комментарий от backbone
TEMP=`getopt -o hS:P:I:l:c:x:t: --long help,sources:,package:,include:,libs:,cc:,cxx:,target:,cflags:,cxxflags:,ldflags: -- "$@"`
eval set -- "$TEMP" 

Эти парни?

И да, какой смысл был проектировать такой тип задания параметров --trust=yes (я имею в виду со знаком «=»), если чтобы это распрасить нужен костыль?

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

Да, эти две строки.

какой смысл был проектировать такой тип задания параметров --trust=yes

Так ведь можно задать и --trust=yes, и --trust yes, и -t=yes, и -t yes, и даже -tyes.

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

--trust yes

Т.е. это не ошибка, как мне казалось?

-tyes.

А это уже нечто невообразимое - а если у меня есть параметры -t -y -e -s? Ведь сокращенная запись тоже допускается. Кстати, а её как парсить?

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

Т.е. это не ошибка, как мне казалось?

getopt нормально обрабатывает такой вариант.

если у меня есть параметры -t -y -e -s

Если после 't' стоит двоеточие, то getopt ожидает после t значение ключа (в данном случае 'yes'), иначе - будет рассматривать 'y' как другой ключ.

backbone ★★★★★
()

man читать уже не модно :-(

$ cat /usr/share/getopt/getopt-parse.bash 
#!/bin/bash

# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script language can be found
# as parse.tcsh

# Example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more'
# Option b, argument ` very long '
# Remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'

# Note that we use `"$@"' to let each command-line parameter expand to a 
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
     -n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

while true ; do
	case "$1" in
		-a|--a-long) echo "Option a" ; shift ;;
		-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
		-c|--c-long) 
			# c has an optional argument. As we are in quoted mode,
			# an empty parameter will be generated if its optional
			# argument is not found.
			case "$2" in
				"") echo "Option c, no argument"; shift 2 ;;
				*)  echo "Option c, argument \`$2'" ; shift 2 ;;
			esac ;;
		--) shift ; break ;;
		*) echo "Internal error!" ; exit 1 ;;
	esac
done
echo "Remaining arguments:"
for arg do echo '--> '"\`$arg'" ; done
drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.