/ / bash może skryptu źródłowego powiedzieć, czy getops został przekazany do rodzica - bash, getopts

bash może pochodzić z skryptu informującego, czy getops został przekazany rodzicowi - bash, getopts

Zastanawiam się, czy i jak źródłowy skrypt basha może stwierdzić, czy zmienna getops została przekazana rodzicowi, na przykład,

.parent.sh -a MyVarForChild_a

w parent.sh Dzwonię . child.sh i chciałbym sprawdzić, czy -a MyVar byłminął. Wolałbym, aby NIE używać getopsa w rodzicach i ustawiać var, jeśli to możliwe, raczej używać czegoś podobnego do getopsa w dziecku, aby sprawdzić, czy ta zmienna została przekazana, a następnie ustawić ją.

parent.sh

#!/bin/sh
set -x

#confirm bash or dash (ec2)
echo $SHELL

child_a="/home/userX/child_a.sh"
. ${child_a} "$@" -b TestVar

dziecko_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

thx, art

AKTUALIZOWANE w celu uzyskania opinii, jak poniżej odpowiedzi ....

Poniższa odpowiedź z @Robin Hsu działa dla powyższego kodu i jest prawidłową odpowiedzią na zadane pytanie i wyniki

$ /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

Jednak wydaje się, że getops będzie wykonywany tylko raz na rodzica i dziecko, więc dodanie getopsa w rodzicu zatrzyma jego działanie w dziecku, na przykład

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} "$@" -b TestVar

wyniki

$ /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

dodatkowo, jeśli dodam drugi skrypt potomny, drugie dziecko (child_b) zawiedzie getopy,

parent.sh

#!/bin/sh
set -x

#confirm bash or dash (ec2)
echo $SHELL

child_a="/home/userX/child_a.sh"
. ${child_a} "$@" -b TestVar

child_b="/home/userX/child_b.sh"
. ${child_a} "$@" -z OtherVar

dziecko_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

dziecko_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

wyprowadzanie

$ /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

Dodatkowe pytanie

Jak mogę mieć rodzica + dzieci z każdym dzieckiem mającym getops?

dzięki Sztuka

Odpowiedzi:

0 dla odpowiedzi № 1

. child.sh ma własną listę argumentów. Oznacza to, że child.sh jest legalne do otrzymywania argumentów w wierszu poleceń w następujący sposób:

. child.sh arg1 arg2 arg3

Myślę więc, że jeśli chcesz przekazać vars, musisz to zrobić:

. child.sh "$@"

--Aktualizacja-- Do dalszego pytania powinieneś napisać skrypt naśladujący ten, który napisałeś dla części getopts, tak jak poniżej:

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

echo $MyPassedVar
echo $MyOptionB

--aktualizacja-- próbować

.  ./child.sh "$@"

Wygląda na to, że bash może to zaakceptować child.sh (jeśli skrypt macierzysty zaczyna się od #! / bin / bash), ale sh może tylko zaakceptować ./child.sh