2015-11-20 2 views
0

Я просто хотел бы использовать calc для вычисления двух глобальных переменных, которые были инициализированы выше в коде, но поскольку I set -x для отладки, один из них пуст, и я не понимаю, что не так.Глобальная переменная Bash пуста в функции

В верхней части моего 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 -x, когда я называю source.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 

Я действительно хотел бы стойте это.

+3

Замечания в bash предшествуют '#', а не '//'. – chrisaycock

+1

Вы используете 'chkValue' в под-оболочке (из-за'() 'wrapping). Присвоения не могут выходить из суб-оболочек. Используйте '{...; } 'wrapping для списка в текущей оболочке. –

+0

Вы не показываете код, который выполняет 'grep^Solde file | awk '{print $ NF}' ', но полезно использовать 'awk'/^ Solde/{print $ NF} 'file' вместо этого. – tripleee

ответ

1

Ваша проблема возникает здесь:

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

Это вызывает подоболочку, и, таким образом, установка значения не несет обратно в родительский процесс. Вы должны переписать это с помощью {}, что позволяет группировать без субоболочке:

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

Было отмечено, что стандартные правила приоритета означает, что использование скобок не было необходимости в этом случае тоже, так что упрощается:

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

thx Petesh, я не знал, что() сделаю подоболочку, теперь я буду осторожен в этом! – nwna

+0

Теперь он решен, спасибо большое! – nwna

Смежные вопросы