我想知道是否& sourced bash脚本如何判断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} "$@" -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
thx,Art
根据以下答案更新反馈意见....
@Robin Hsu的以下答案适用于上述代码,是问题和输出的有效答案
$ /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
然而,似乎每个父母只会执行一次get& child,所以在父级中添加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} "$@" -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
另外,如果我添加第二个子脚本,则第二个子节点(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} "$@" -b TestVar
child_b="/home/userX/child_b.sh"
. ${child_a} "$@" -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?
THX 领域
答案 0 :(得分:0)
. child.sh
有自己的参数列表。这意味着child.sh在命令行中接收参数是合法的:
. child.sh arg1 arg2 arg3
所以,我认为如果你想传递变量,你需要这样做:
. child.sh "$@"
<强> - 更新 - 强> 对于你的进一步问题,你应该把你的脚本写成你编写的脚本,对于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 "$@"
bash似乎可以接受child.sh
(如果您的父脚本以#!/ bin / bash开头),但sh只能接受./child.sh