Bash:如何跳过卡住的功能?

Cur*_*bie 4 bash shell-script

#!/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
Run Code Online (Sandbox Code Playgroud)

显示了什么

(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
Run Code Online (Sandbox Code Playgroud)

我想要的是

(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
(some error or nothing at all)
SKIP
Run Code Online (Sandbox Code Playgroud)

如果您尝试编译此 bash shell 代码,您将陷入#3。那么,如何告诉终端忽略无法处理的内容并继续下一个过程呢?

如果问题不清楚,请告诉我,谢谢

Ste*_*itt 14

当你的脚本停止时,它\xe2\x80\x99实际上numfmt正在等待输入\xe2\x80\x94按下Ctrld,它将继续。

\n

发生这种情况是因为numfmt如果 it\xe2\x80\x99 未给出任何非选项参数并且$cc为空,则格式化其标准输入。

\n

避免出现numfmt这样的块的通用技术是让它读取/dev/null

\n
numfmt --g $1 < /dev/null | sed \'s/,/./g;s/@//g\'\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅为什么这个 while 循环在第一次迭代后退出?这个技术有用的另一个例子。

\n

然而,在您的具体情况下,更好的方法是引用您的变量;那么numfmt总会有一个参数,即使$1是空的:

\n
numfmt --g "$1" | sed \'s/,/./g;s/@//g\'\n
Run Code Online (Sandbox Code Playgroud)\n

您还应该避免在脚本中使用选项缩写;如果 的未来版本引入另一个以 \xe2\x80\x9cg\xe2\x80\x9d 开头的长选项,则--g可能会中断。numfmt当我们\xe2\x80\x99 这样做时,请确保将选项与参数分开--(否则numfmt会拒绝负值):

\n
numfmt --grouping -- "$1" | sed \'s/,/./g;s/@//g\'\n
Run Code Online (Sandbox Code Playgroud)\n

然后该脚本将不间断地运行直至完成。一旦你确定了$cc计算,它就会输出预期的结果;同时,"$1"您将看到\xe2\x80\x99 的变体

\n
numfmt: invalid number: \xe2\x80\x98\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n