Shell脚本添加float和integer

时间:2015-08-24 08:57:34

标签: bash shell

我无法在

的计算中调试错误
case $code in
    ${menuCode[0]} )
        CBcost=$(echo "${menuItemsCost[0]} * $quantity" |bc) 
        sumOfCheeseBurgers=$(echo "$sumOfCheeseBurgers + $CBcost" |bc) 
    ;;

我需要能够添加汉堡的所有总和,并在每次用户输入Y进行另一次交易时将其存储到sumOfBurgers。但是,我一直在(standard_in) 1: syntax error。如何正确表达sumOfBurgers=sumOfBurgers + CBcost?

declare -a menuItems=( 'Cheese Burger' 'Ham Burger' 'Spaghetti' 'Fried  Chicken' 'Softdrinks' )
declare -a menuItemsCost=( 25.00 20.00 24.00 30.00 15.00 )
declare -a menuCode=( CB HB SP FC SD )

clear

printf "MENU\n"
printf "=================================\n"
printf "CODE\tDESCRIPTION\t PRICE\t|\n"
echo   "================================="
printf "${menuCode[0]}  |\t${menuItems[0]}\t| ${menuItemsCost[0]} |\n"
printf "${menuCode[1]}  |\t${menuItems[1]}\t| ${menuItemsCost[1]} |\n"
printf "${menuCode[2]}  |\t${menuItems[2]}\t| ${menuItemsCost[2]} |\n"
printf "${menuCode[3]}  |\t${menuItems[3]}\t| ${menuItemsCost[3]} |\n"
printf "${menuCode[4]}  |\t${menuItems[4]}\t| ${menuItemsCost[4]} |\n"
printf "=================================\n"

choice="Y"
while [ $choice == "Y" ] 
    do
    printf "What's your order please? \n[Enter Code]: "
    read code
        while [ "$code" != "CB" ] && [ "$code" != "HB" ] && [ "$code" != "SP" ] && 
                [ "$code" != "FC" ] && [ "$code" != "SD" ]   
            do 
                printf "Please enter a valid ORDER code. \n[Enter Code]: " 
                    read code
                    code=$code 
        done

printf "Enter Quantity: "
    read quantity
printf "Do another transaction [Y/N]?: "
    read choice

case $code in
     ${menuCode[0]} )
        CBcost=$(echo "${menuItemsCost[0]} * $quantity" |bc) 
        sumOfCheeseBurgers=$(echo "$sumOfCheeseBurgers + $CBcost" |bc) 
    ;;
esac

done

printf "$sumOfCheeseBurgers\n"

1 个答案:

答案 0 :(得分:1)

您需要在此处使用之前初始化sumOfCheeseBurgers,否则它是一个空字符串,会导致bc语法错误:

sumOfCheeseBurgers=$(echo "$sumOfCheeseBurgers + $CBcost" |bc)

while循环之前添加以下行:

sumOfCheeseBurgers=0

或者,正如评论(感谢)中所指出的,您可以使用此语法来指定默认值:

sumOfCheeseBurgers=$(echo "${sumOfCheeseBurgers-0} + $CBcost" |bc) 

如果您运行类似bash -x script.sh的脚本,则可以更清楚地看到此错误:

++ echo ' + 50.00'
++ bc

如您所见,传递给bc的字符串在+之前缺少值。

另外,您应该使用printf格式说明符。例如:

printf "${menuCode[0]}  |\t${menuItems[0]}\t| ${menuItemsCost[0]} |\n"

应该是这样的:

printf '%s  |\t%s\t| %s |\n' "${menuCode[0]}" "${menuItems[0]}" "${menuItemsCost[0]}"

这是使用printf的正确方法,因为它可以防止变量中的字符被解释为转义字符(例如换行符或制表符)。