bash可以使用源脚本来判断是否已将getops传递给父级

时间:2014-11-18 06:06:08

标签: bash getopts

我想知道是否& 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 领域

1 个答案:

答案 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