Benji
Benji

Reputation: 635

Bash not sourcing code as expected

I have these two scripts, configScript.shand genScript.sh. The first one works just the way I want it to work. It adds the correct values into options.sh and echo the right message. However, I want genScript.sh to accept the current argument in options.sh and output the correct echo. As it is now when I run genScript.sh it returns null and I can't figure out why.

#!/bin/bash -x
#configScript.sh
func()
{
echo "
Choose
1 - Option 1
2 - Option 2
"
echo -n "   Enter selection: "
read select
case $select in
            1 ) 
            echo "  Option 1 chosen"
            . ./genScript.sh one
            cat << EOF >options.sh
OPTION=$OPTION
EOF
            ;;
            2 )
            echo "  Option 2 chosen"
            . ./genScript.sh two
            cat << EOF >options.sh
OPTION=$OPTION
EOF
            ;;
esac
}
func

#!/bin/bash -x
#genScript.sh
. options.sh
OPTION=$1
func2()
{
    if [ "$OPTION" == one ] ; then
        echo "Option one"
    elif [ "$OPTION" == two ] ; then
        echo "Option two"
    else
        echo "null"
    fi
}
func2

I managed to get genScript.sh to work the way I want by removing OPTION=$1. When I do that genScript.sh will accept the value inside options.sh and will output the right echo . BUT when I remove OPTION=$1 configScript.sh stops working as it should, it doesn't update options.sh with a new value anymore.

Upvotes: 0

Views: 59

Answers (2)

Grigor Yosifov
Grigor Yosifov

Reputation: 1474

Just put quotes around "one" and "two" in the second script and in the first script where it generates options.sh and added default value $OPTION to the OPTION var in the second script so now it works.

#!/bin/bash -x
#configScript.sh
func()
{
echo "
Choose
1 - Option 1
2 - Option 2
"
echo -n "   Enter selection: "
read select
case $select in
            1 )
            echo "  Option 1 chosen"
            . ./genScript.sh one
            cat << EOF >options.sh
OPTION="$OPTION"
EOF
            ;;
            2 )
            echo "  Option 2 chosen"
            . ./genScript.sh two
            cat << EOF >options.sh
OPTION="$OPTION"
EOF
            ;;
esac
}
func

#!/bin/bash -x
#genScript.sh
. options.sh
OPTION=${1-$OPTION}
func2()
{
    if [ "$OPTION" == "one" ] ; then
        echo "Option one"
    elif [ "$OPTION" == "two" ] ; then
        echo "Option two"
    else
        echo "null"
    fi
}
func2

That is one of the most irritating problems. I don't know if you are using editor with syntax highlighting but you better be so you run easily over this type of issues.

Upvotes: 0

neon
neon

Reputation: 482

The problem is with the way you want genScript to be called. I think you want to run genScript with command line argument and as-well as with sourcing from options.sh.

Below changes to genScript.sh would serve the purpose. It gives preference to command line when both command line and options.sh have values.

#!/bin/bash -x
#genScript.sh
OPTION=""
. options.sh
[ "$1" ] && OPTION=$1
func2()
{
    if [ "$OPTION" == one ] ; then
        echo "Option one"
    elif [ "$OPTION" == two ] ; then
        echo "Option two"
    else
        echo "null"
    fi
}
func2

Upvotes: 1

Related Questions