我正在尝试设计一个脚本,该脚本以欧元和美分给出任意命令行输入,使用最小数量的纸币或硬币计算出零钱。该脚本可以很好地处理没有小数点的数字,例如:
[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。如果是,则使用模数获取余数并保存我使用过的纸币/硬币的数量。如果您不了解我的“惊人”解释技能,则可以使用以下代码。
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
如果要使用逗号,则需要设置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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句