2014-11-18 5 views
0

мне интересно, если & как источников Баш скрипт может сказать, если getops переменная была передана родителю, например,Баш может сделать найденный сценарий сказать, если getops был принят к родителю

.parent.sh -a MyVarForChild_a 

в parent.sh Я звоню . child.sh, и я хотел бы проверить, прошел ли -a MyVar. Я бы предпочел НЕ использовать getops var в родительском и установить var, если это возможно, вместо этого используйте что-то похожее на getops в ребёнке, чтобы проверить, прошел ли этот var, и установите его.

parent.sh

#!/bin/sh 
set -x 

#confirm bash or dash (ec2) 
echo $SHELL 

child_a="/home/userX/child_a.sh" 
. ${child_a} "[email protected]" -b TestVar 

child_a.sh

#!/bin/sh 
set -x 

while getopts "a:b:" OPTION 
do 
    case $OPTION in 
     a) 
      MyPassedVar=$OPTARG 
      ;; 
     b) 
      MyTestVar=$OPTARG 
      ;;  
     esac 
done 

echo $MyPassedVar 
echo $MyTestVar 

ТНХ, Арт

ОБНОВЛЕНО для обратной связи как ниже ответы ....

Ниже ответ от @Robin Хсу работает для приведенной выше коды и является действительным ответом на поставленный вопрос и выходы

$ /home/userX/parent.sh -a ThisIsPassed 
+ echo /bin/bash 
/bin/bash 
+ child_a=/home/userX/child_a.sh 
+ . /home/userX/child_a.sh -a ThisIsPassed -b TestVar 
++ set -x 
++ getopts a:b: OPTION 
++ case $OPTION in 
++ MyPassedVar=ThisIsPassed 
++ getopts a:b: OPTION 
++ case $OPTION in 
++ MyTestVar=TestVar 
++ getopts a:b: OPTION 
++ echo ThisIsPassed 
ThisIsPassed 
++ echo TestVar 
TestVar 

Однако, кажется, getops будет выполняться только один раз в родительские & ребенке, так что добавление getops в родитель остановит его работу в ребенке, такие, как

parent.sh (ver2)

#!/bin/sh 

set -x 
#confirm bash or dash (ec2) 
echo $SHELL 

while getopts "x:" OPTION 
do 
    case $OPTION in 
     x) 
      MyXvar_notPassed=$OPTARG 
      ;; 
     esac 
done 

child_a="/home/userX/child_a.sh" 
. ${child_a} "[email protected]" -b TestVar 

выходов

$ /home/userX/parent.sh -a ThisIsPassed 
+ echo /bin/bash 
/bin/bash 
+ getopts x: OPTION 
/home/userX/parent.sh: illegal option -- a 
+ case $OPTION in 
+ getopts x: OPTION 
+ child_A=/home/userX/child_a.sh 
+ . /home/userX/child_a.sh -a ThisIsPassed -b TestVar 
++ set -x 
++ getopts a:b: OPTION 
++ echo 

++ echo 

дополнительно, если добавить 2-го ребенка сценарий, то второй ребенок (child_b) проваливает getops,

parent.sh

#!/bin/sh 
set -x 

#confirm bash or dash (ec2) 
echo $SHELL 

child_a="/home/userX/child_a.sh" 
. ${child_a} "[email protected]" -b TestVar 

child_b="/home/userX/child_b.sh" 
. ${child_a} "[email protected]" -z OtherVar 

child_a.sh

#!/bin/sh 
set -x 

while getopts "a:b:" OPTION 
do 
    case $OPTION in 
     a) 
      MyPassedVar=$OPTARG 
      ;; 
     b) 
      MyTestVar=$OPTARG 
      ;;  
     esac 
done 

echo $MyPassedVar 
echo $MyTestVar 

child_b.sh

#!/bin/sh 
set -x 

while getopts "a:z:" OPTION 
do 
    case $OPTION in 
     a) 
      MyPassedVarA=$OPTARG 
      ;; 
     z) 
      MyOtherVar=$OPTARG 
      ;;  
     esac 
done 

echo $MyPassedVarA 
echo $MyOtherVar 

вывод

$ /home/userX/parent.sh -a ThisIsPassed 
+ echo /bin/bash 
/bin/bash 
+ child_a=/home/userX/child_a.sh 
+ . /home/userX/child_a.sh -a ThisIsPassed -b TestVar 
++ set -x 
++ getopts a:b: OPTION 
++ case $OPTION in 
++ MyPassedVar=ThisIsPassed 
++ getopts a:b: OPTION 
++ case $OPTION in 
++ MyTestVar=TestVar 
++ getopts a:b: OPTION 
++ echo ThisIsPassed 
ThisIsPassed 
++ echo TestVar 
TestVar 
+ child_b=/home/userX/child_b.sh 
+ . /home/userX/child_b.sh -a ThisIsPassed -z OtherVar 
++ set -x 
++ getopts a:z: OPTION 
++ echo 

++ echo 

Дополнительного вопрос

Как я могу иметь родитель + ребенок с каждым ребенком, имеющим getops?

ТНХ Art

ответ

0

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

. child.sh arg1 arg2 arg3 

Так что, я думаю, что если вы хотите, чтобы передать ВАР, что вам нужно сделать это:

. child.sh "[email protected]" 

--Update-- для вашего дальнейшего вопроса, вы должны написать сценарий имитировать на тот, который вы написали, для getopts части, как это:

while getopts "a:b:" OPTION 
do 
    case $OPTION in 
     a) 
      MyPassedVar=$OPTARG 
      ;; 
     b) 
      MyOptionB=$OPTARG 
      ;; 
     esac 
done 

echo $MyPassedVar 
echo $MyOptionB 

--update-- попробовать

. ./child.sh "[email protected]" 

кажется, что баш может принять child.sh (если ваш родительский сценарий начинается с #!/Bin/Баш), но ш может принимать только ./child.sh

+0

означает, что ваш цикл getopts обрабатывает пустой аргумент , так как вы создаете скрипты sources.sh без аргументов. –

+0

thx @Robin, похоже, что var теперь передается. Если я установил -x, я увижу '. child.sh -a MyVAr ', однако child.sh все равно не подбирает, что -a установлено. –

+0

thx @Robin, по-прежнему не повезло после добавления котировок на вызов «$ @», сценарий по-прежнему сообщает только -b TestVar в getops –

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

  • Нет связанных вопросов^_^