发布编辑:
我的脚本中有一个功能,它不会像我想要的那样工作。 目标是验证数字,然后格式化为十进制。
所以我创建了一个看起来像我的函数的测试文件......
TMP_NUM="$1"
if [[ "$TMP_NUM" = *[[:digit:]]* ]]; then
if [[ "$TMP_NUM" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
echo "$TMP_NUM"
else
TMP_DECIMAL=$(awk -v decimal="$TMP_NUM" 'BEGIN {printf("%f", decimal) }')
if [[ "$TMP_DECIMAL" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
echo "$TMP_DECIMAL"
else
echo "failed !"
fi
fi
else
echo "failed !"
fi
exit 0
结果......
mario@antec:~$ test.function4.sh 1e-06
0.000001
mario@antec:~$ test.function4.sh 1e-05
0.000010
mario@antec:~$ test.function4.sh 0Hallo
0.000000
我如何更改测试参数以仅获取格式化数字,并且当任何数字后面的任何字母后面都有错误消息,eE除外?
答案 0 :(得分:3)
awk
救援!
定义此功能
test_number() { awk -v v="$1" 'BEGIN{if(v+0==v) printf "%f\n",v; else print "failed!"}';}
使用
$ test_number XXX
failed!
$ test_number 2323
2323.000000
$ test_number 0.23234
0.232340
$ test_number 0.23234XX
failed!
$ test_number 0.23234E4
2323.400000
答案 1 :(得分:1)
您可以这样重写代码 - 在格式化之前检查数字:
#!/bin/bash
TMP_NUM="$1"
if [[ "$TMP_NUM" =~ ^[0-9]+([.][0-9]+)?$ ]]; then
TMP_DECIMAL=$(awk -v decimal="$TMP_NUM" 'BEGIN {printf("%f", decimal) }')
echo "$TMP_DECIMAL"
else
echo "failed !"
fi
printf
正在舍入您的号码。您可以更改格式字符串以指定要保留的小数位数。