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