#!/bin/bash
function thous {
numfmt --g $1 | sed 's/,/./g;s/@//g'
}
aa="1,235"
bb="5,22"
cc=$(echo "$aa + $bb" | bc)
#1
echo $aa
#2
echo $bb
#3
echo $(thous "$cc")
#4
echo "SKIP"
exit
显示了什么
(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
我想要的是
(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
(some error or nothing at all)
SKIP
如果您尝试编译此 bash shell 代码,您将陷入#3。那么,如何告诉终端忽略无法处理的内容并继续下一个过程呢?
如果问题不清楚,请告诉我,谢谢
答案1
当你的脚本停止时,它实际上是numfmt
在等待输入——按下Ctrld它就会继续。
发生这种情况是因为numfmt
如果没有给出任何非选项参数并且$cc
为空,则会格式化其标准输入。
避免出现这样的块的通用技术numfmt
是让它读取/dev/null
:
numfmt --g $1 < /dev/null | sed 's/,/./g;s/@//g'
看为什么这个 while 循环在第一次迭代后退出?这个技术有用的另一个例子。
然而,根据您的具体情况,更好的方法是引用你的变量;那么numfmt
总会有一个参数,即使$1
是空的:
numfmt --g "$1" | sed 's/,/./g;s/@//g'
您还应该避免在脚本中使用选项缩写;如果 的未来版本引入另一个以“g”开头的长选项,--g
则可能会被破坏。numfmt
当我们这样做时,请确保将选项与参数分开--
(否则numfmt
会拒绝负值):
numfmt --grouping -- "$1" | sed 's/,/./g;s/@//g'
然后该脚本将不间断地运行直至完成。一旦你确定了$cc
计算,它就会输出预期的结果;同时,"$1"
您将看到变体
numfmt: invalid number: ‘’