如何在我的bash脚本中添加“.2”?

时间:2013-05-29 16:17:36

标签: regex bash math printf

我的bash脚本是

read -p "num 1: " num1
read -p "num 2: " num2
tmbk=$(echo $num1 + $num2 | bc | sed '
    s/^\./0./     # .2 -> 0.2
    s/^-\./-0./   # -.2 -> -0.2
    s/\.0*$//     # 2.000 -> 2
');
printf "result : %'d\n" $tmbk

我使用printf "%'d\n"将3与零分开。如果我使用printf "%s\n"字符串,则此命令不会将3与零分开。

我的问题: 如果我在num1输入0.1,在num2输入0.1,为什么结果看起来像这样?

printf : 0.2: invalid number
result : 0

我希望我的bash脚本能够打印result: 0.2而不是invalid number

4 个答案:

答案 0 :(得分:4)

%d用于整数。请改为%f

答案 1 :(得分:1)

以这种方式怎么样?

echo "num 1 :"
read num1
echo "num 2 :"
read num2
awk -v a="$num1" -v b="$num2" 'BEGIN{print "result:" a+b}';

如果您需要某种输出格式,可以在awk中使用printf

答案 2 :(得分:0)

所以你想看''。作为千分隔符还要作为小数点? 不好主意因为那时你无法确定1.234是浮点数还是整数。

locales用于处理此类事物(需要安装这些语言环境):

for loc in C en_US de_DE de_CH; do 
    LC_NUMERIC=$loc
    printf "%'d\t%'f\t%s\n" 1234 1234 $loc
done

结果:

1234    1234.000000     C
1,234   1,234.000000    en_US
1.234   1.234,000000    de_DE
1'234   1'234.000000    de_CH

如您所见,这些语言环境中没有一个使用相同的字符表示千位分隔符和小数点,这很好。

一旦你选择了合适的语言环境,你就只能同意Kent的观点。如果你不喜欢bc的格式化,awk比bc更好。

答案 3 :(得分:0)

你的要求有点奇怪“有分离点的整数(1.000.000)”,你一直在做什么?

另外我会在行中做一个小的补充..... echo“scale = 4; $ num1 + $ num2”| bc

表示“无效数字输出”:: bash的printf使用与C的printf()函数中相同的格式,作为libc库的一部分....因此

%d , %i : stands for integers 
%g , %f : stands for floating point ... likewise ,

这使用了printf()在c程序中使用的相同验证,因此将注释“invalid number”置于遇到一个期望整数的float上,如下所示:

 Kaizen ~
  $ printf "result : %'d\n" 2.3
   -bash: printf: 2.3: invalid number
  result : 2

Kaizen ~
 $ printf "result : %'li\n" 2.3
  -bash: printf: 2.3: invalid number
 result : 2

我同意@ignacio建议的内容,因此如果您要使用浮点值进行打印,那么您应该在代码中添加%g或更高的%f。以下内容适用于您的代码中的所有方案:

Kaizen ~
 $ printf "result : %'f\n" 2.3
result : 2.300000

Kaizen ~
 $ printf "result : %'g\n" 2.3
result : 2.3