带十进制数的运算问题(Korn Shell)

时间:2014-09-30 14:12:45

标签: shell operators ksh decimal-point

我试图设计一个脚本,以欧元和美分给出任意的命令行输入,使用最小数量的音符或硬币计算变化。该脚本适用于没有小数点的数字, 例如:

[icapjser@if3tl0060 ]$ ksh my_script.sh 34212
68 500 euro note/s
1 200 euro note/s
1 10 euro note/s
1 2 euro coin/s

当我将带小数点的数字作为参数传递时,问题就开始了,我将首先解释一下我的代码是如何工作的,以便您可以更好地理解问题,首先我创建一个包含所有数组的数组笔记和硬币的不同值(500,200等等)然后我迭代该数组检查除法的结果(total_euros / note_or_coin_value)是否大于或等于1.如果是这样我使用模数得到剩余并保存我使用过的笔记/硬币数量。如果你不理解我的#34;那么这就是代码。解释技巧。

CANT=$1
RES=''
vals=(500 200 100 50 20 10 5 2 1 0,50 0,20 0,10 0,05 0,02 0,01)
flag=1
i=0

while [ $flag -eq 1 ]; do

n=$(expr $CANT / ${vals[$i]})

if [ $n -ge 1 ]; then     # <- LINE 22


    if [ ${vals[$i]} -gt 2 ]; then
        RES=$RES' '$n' '${vals[$i]}' euro note/s\n'
    else
        RES=$RES' '$n' '${vals[$i]}' euro coin/s\n'
    fi 

    CANT=$(expr $CANT % ${vals[$i]})
fi

if [ $CANT -eq 0 ]; then
    flag=0
fi

i=$i+1

if [ $i -gt 14 ]; then
    flag=0
fi

done

echo -e $RES 

现在为什么它在没有小数点的情况下完美运行,但是当它们存在时它会这样做:

[icapjser@if3tl0060 ejercicios]$ ksh my_script.sh 3421,32
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected
expr: non-numeric argument
my_script.sh[22]: [: argument expected

我希望你能理解这个问题,谢谢你的进步。 PS:如果有什么东西不清楚只是评论,我会更新! :P

1 个答案:

答案 0 :(得分:3)

如果您想使用逗号,则需要设置LC_NUMERIC:

$ echo $LC_NUMERIC

$ echo $(( 1.5 * 2.5 ))
3.75
$ export LC_NUMERIC=it_IT
$ echo $(( 1.5 * 2.5 ))  
ksh:  1.5 * 2.5 : arithmetic syntax error
$ echo $(( 1,5 * 2,5 ))
3,75
$ ksh --version
  version         sh (AT&T Research) 93u+ 2012-08-01

和expr无论如何都不能做浮点数学

$ expr 1.5 \* 2.5
expr: non-integer argument
$ expr 1,5 \* 2,5
expr: non-integer argument