Как обрабатывать getopts оболочки с параметром, содержащим пробелы - PullRequest
14 голосов
/ 16 мая 2011

Я ищу способ обработки аргументов, содержащих пробелы, которые необходимо проанализировать по команде оболочки getopts.

while getopts ":a:i:o:e:v:u:" arg
  do
  echo "ARG is: $arg" >> /tmp/submit.log
  case "$arg" in
  a) arg1="$OPTARG" ;;
  i) arg2="$OPTARG" ;;
  o) arg3="$OPTARG" ;;
  ...
  u) argn="$OPTARG" ;;
  -) break ;;
  \?) ;;
  *) echo "unhandled option $arg" >> /tmp/submit.log ;;
  ?) echo $usage_string
     exit 1 ;;
  esac
done

Теперь, если -u имеет аргумент типа "STRING WITH WHITE SPACE" чем только первая часть строки, и цикл while не доходит до конца.

большое спасибо.

Ответы [ 2 ]

30 голосов
/ 20 ноября 2011

ловушка для молодых игроков (то есть меня!)

остерегайтесь такой строки:

main $@

, что вам действительно нужно:

main "$@"

в противном случаеgetopts раскроет ваши опции на мелкие кусочки

http://www.unix.com/shell-programming-scripting/70630-getopts-list-argument.html

10 голосов
/ 17 мая 2011

Как отмечает Mat , ваш фрагмент скрипта уже верен. Если вы вызываете свой скрипт из оболочки, вам нужно правильно указать аргументы, например

myscript -u "string with white space"
myscript -u 'string with white space'
myscript -u string\ with\ white\ space
myscript -u string' w'ith\ "whi"te" "''space

Требование этих кавычек не является дефектом в вашем скрипте, это способ работы вызывающей оболочки. Все программы, сценарии или другие, получают аргументы в виде списка строк. Кавычки в вызывающей оболочке используются для сортировки этих аргументов в отдельные «слова» (элементы списка). Все вышеперечисленные вызовы (сделанные из оболочки Unix) передают скрипту список из трех строк: $0 - это имя скрипта (myscript), $1 - это -u и $2 - строка string with white space.

...