Я просто хотел бы использовать 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
Я действительно хотел бы стойте это.
Замечания в bash предшествуют '#', а не '//'. – chrisaycock
Вы используете 'chkValue' в под-оболочке (из-за'() 'wrapping). Присвоения не могут выходить из суб-оболочек. Используйте '{...; } 'wrapping для списка в текущей оболочке. –
Вы не показываете код, который выполняет 'grep^Solde file | awk '{print $ NF}' ', но полезно использовать 'awk'/^ Solde/{print $ NF} 'file' вместо этого. – tripleee