2016-11-23 1 views
0

Следующий код выполняется в subscript.sh и subscript.sh запускается внутри primaryscript.shGetops рассмотреть мой вариант цепочку в качестве аргумента для первого

#### primaryscript.sh 
#! /bin/bash 
#... 
"$bss_path"/subscript.sh "$option" 
#... 

Я использую этот код для разбора моих аргументов и их значения :

#### subscript.sh 
#! /bin/bash 

while getopts "hw:l:s:b:" opt; do 
    case $opt in 
    w) 
     x="$OPTARG";; 
    l) 
     xx="$OPTARG";; 
    s) 
     xxx="$OPTARG";; 
    b) 
     xxxx="$OPTARG";; 
    h) 
     print_usage 
     exit 0;; 
    \?) 
     echo "Invalid option: -$OPTARG" 
     exit 1;; 
    esac 
done 

проблема появляется, когда я называю мой сценарий с несколькими аргументами:

./myscript -l 5.0.3-0 -s 4.0-0 -b 010

гэппозмы думаю, что опция l есть 5.0.3-0 -s 4.0-0 -b 010 как аргумент.

Что я делаю неправильно? Я попытался поиграть с : и с опцией, но, как я понял, я должен поставить их за варианты, принимающие аргумент правильно? И getops, естественно, знает, что - является разделителем аргументов.

$> echo $BASH_VERSION 
$> 3.2.25(1)-release 
+0

С bash 3.1.17 (от RHEL 5) и 4.2.8 (от Ubuntu 11.04): если я добавлю это как последнюю строку, он отлично подходит для меня: 'echo -e 'w: $ x \ nl: $ xx \ ns: $ xxx \ nb: $ xxxx "' – Cyrus

+0

Добавьте строку, которая выполняет этот сценарий, и покажет shebang этого скрипта. Btw. ваш скрипт отлично работает с bash, sh, dash и zsh. – Cyrus

+0

Ваш вопрос стал очень неясным. Не могли бы вы отредактировать его, удалить абзацы «EDIT1» .... и просто показать нам, какие операции вы выполняете до того, как вызвали цикл getopts? – Aserre

ответ

0

Как Кир отметил в комментарии, проблема в том, как я передал аргументы.

./myscript "$options" 

Правильный путь:

./myscript $options 

С «$ варианты» не будет заботиться о пространствах и взять всю строку в качестве единственного аргумента.

+0

Что такое '$ options' и откуда оно взялось? Правильный способ передачи параметров из одного сценария в другой - использовать '' $ @ "'; если вам нужно сохранить их в промежуточной переменной, используйте массив, а не просто переменную (при условии, что вы используете bash или какую-либо другую оболочку с массивами.) – rici

+0

Я генерирую параметры своего сценария, используя сложную логику заранее, и создаю «строка опций», содержащая несколько опций.Я думаю, что я не ошибаюсь, моя ошибка заключалась в том, чтобы поставить их как один аргумент вместо нескольких –

0

Это работает для меня. Вы можете больше узнать о GETOPTS, OPTARG, а также о цикле while и case, набрав «man bash» в вашей оболочке и поиске.

#!/bin/bash 

while getopts "hw:l:s:b:" opt; do 
    case $opt in 
    w) 
     x="$OPTARG";; 
    l) 
     xx="$OPTARG";; 
    s) 
     xxx="$OPTARG";; 
    b) 
     xxxx="$OPTARG";; 
    h) 
     print_usage 
     exit 0;; 
    \?) 
     echo "Invalid option: -$OPTARG" 
     exit 1;; 
    esac 
done 

echo $xx 
echo $xxxx 
echo $xxx 

Выход:

5.0.3-0 
010 
4.0-0 
+0

Hum действительно работает для меня тоже, если я просто использую этот кусок кода ... Я в замешательстве. Я отредактировал свой вопрос –

+0

Хотя этот фрагмент кода может решить вопрос, в том числе объяснение * how * и * why *, это решает проблему [действительно поможет] (// meta.stackexchange.com/q/114762), чтобы улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

Смежные вопросы