Bash全局变量在函数中为空

时间:2015-11-20 14:32:59

标签: bash shell global var

我只想使用calc来计算在代码中初始化更高的两个全局变量,但是作为调试的set -x,其中一个是空的,我不明白,怎么了。

在我的source.sh的顶部,我有这些声明:

userValue=""
newSolde="
currentSolde=""

[...]

// check the format of a float number

// subsitute "," to "." for 'userValue' will be given to calc later


chkValue() {

if [[ "$1" == +([0-9])?(?(.|,)*([0-9])) ]] 
then
    userValue=$(echo "$1" |sed 's/,/\./')
    newOp="$newOp $userValue"
    return 0
else
    echo "$1 Montant invalide"
    return 1
fi
}

[...]

我在这里调用函数chkValue

getOps(){
[[ "$#" -ne 3 ]] && echo -e "missing args" && exit

currentDate=`date +%a%d/%m/%y`
newOp="$currentDate"

# "newOp" is completed by those 3 functions
(chkOperation "$1" && chkMotif "$2" && chkValue "$3") || exit 1
}

calculateNewSolde() {
    newSolde=$(calc -p -- "$userValue"+"$currentSolde") // ***** here it is ****
}

[...]

以下是set -xsource.sh -c "a string" 58,6时的结果:

+ chkValue 58,6
+ [[ 58,6 == +([0-9])?(?(.|,)*([0-9])) ]]
++ echo 58,6
++ sed 's/,/\./'
+ userValue=58.6 // <--- init there
+ newOp='ven.20/11/15 CREDIT tou hghj 58.6'
+ return 0
+ getCurrentSoldeFrom /iuser/DATABASE/1000/DB_1000
+ database=/iuser/DATABASE/1000/DB_1000
++ grep '^Solde' /iuser/DATABASE/1000/DB_1000
++ awk '{print $NF}'
+ currentSolde=15.6
+ calculateNewSolde
++ calc -p -- +15.6 // <---- ???
+ newSolde=15.6

我真的很想理解这一点。

1 个答案:

答案 0 :(得分:1)

你的问题出现在这里:

(chkOperation "$1" && chkMotif "$2" && chkValue "$3") || exit 1

这会导致子shell,因此值的设置不会返回到父进程。你应该使用{}重写它,它允许在没有子shell的情况下进行分组:

{ chkOperation "$1" && chkMotif "$2" && chkValue "$3"; } || exit 1

已经注意到,标准优先规则意味着在这种情况下也不需要使用括号,因此它简化为:

chkOperation "$1" && chkMotif "$2" && chkValue "$3" || exit 1