мне интересно, если & как источников Баш скрипт может сказать, если 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
означает, что ваш цикл getopts обрабатывает пустой аргумент , так как вы создаете скрипты sources.sh без аргументов. –
thx @Robin, похоже, что var теперь передается. Если я установил -x, я увижу '. child.sh -a MyVAr ', однако child.sh все равно не подбирает, что -a установлено. –
thx @Robin, по-прежнему не повезло после добавления котировок на вызов «$ @», сценарий по-прежнему сообщает только -b TestVar в getops –