Анализ параметров ввода, содержащих пробелы, в скрипте bash - PullRequest
0 голосов
/ 12 февраля 2011

У меня есть опция ввода синтаксического анализа bash-скрипта с блоком кода, подобным следующему

for WORD in "$@" ; do
 case $WORD in
  --*) true ;
    case $WORD in
      --opt1=*) 
          OPT1=${WORD/--opt1=/}
          shift ;;
      --opt2=*) 
          OPT2=${WORD/--opt2=/}
          shift ;;
      *) echo "Unrecognized argument $WORD"      
          ;; 
    esac ;;
  *) echo "Option $WORD not starting with double dash."  
  ;; 
 esac
done

Сценарий вызывается другой родительской программой, которая создает всю командную строку.Выходные данные, созданные этой родительской программой, выглядят как

./childscript.sh "--opt1=value1 --opt2=value2"

Проблемы возникают, когда сгенерированная строка выглядит как

./childscript.sh "--opt1='value11 value12' --opt2=value2"

Сценарии жалуются, говоря

Option value12 not starting with double dash.

Какя могу изменить дочерний код Bash, чтобы он понимал пробелы внутри параметров ввода?

1 Ответ

1 голос
/ 12 февраля 2011

Я не думаю, что сгенерированная строка - это то, что вы думаете.

Ваш код прекрасно работает для меня, если я просто вызываю его напрямую. С добавленным эхом, чтобы проверить, что значения хранятся в нужном месте:

$ ./child.sh --opt1='v1 v2' --opt2='v3 v4'
OPT1='v1 v2'
OPT2='v3 v4'

Вы должны быть в состоянии подтвердить это. Ваша проблема не в том, чтобы заставить дочерний скрипт принимать такие аргументы, а в том, чтобы родительский скрипт вызывал его правильно.

И, кстати, вы не на самом деле хотите запустить что-то вроде этого:

./childscript.sh "--opt1=value1 --opt2=value2"

Это приведет к тому, что вся строка (--opt1=value1 --opt2=value2) будет прочитана как один аргумент. Я подозреваю, что вы не рассказали нам полную историю о том, как родительский сценарий вызывает это. Если вы покажете нам эти подробности, мы, вероятно, сможем помочь больше - или, может быть, этого достаточно для намека.

...