Phi*_*ide 21 shell pipe bc output
我有一个简单的 bash 函数将两个数字相除:
echo "750/12.5" | bc
Run Code Online (Sandbox Code Playgroud)
我想采取输出bc
和追加/24
和管道表示结果的另一个实例bc
。
就像是:
echo "750/12.5" | bc | echo $1 + "/24" | bc
Run Code Online (Sandbox Code Playgroud)
$1
管道结果在哪里。
PS我意识到我可以做echo "750/12.5/24" | bc
我的问题更多的是关于将文本附加到管道结果。
Hug*_*ugo 23
我使用sed
并替换了行尾实现了这一点:
echo "my text" | sed 's/$/ more text/'
Run Code Online (Sandbox Code Playgroud)
返回:
my text more text
Run Code Online (Sandbox Code Playgroud)
你的例子:
echo "750/12.5" | bc | sed 's/$/\/24/' | bc
Run Code Online (Sandbox Code Playgroud)
ver*_*nzt 20
替代方法:
TL;DR:用于与 stdin ( ) 作为参数cat
连接。-
请注意,它会用换行符分隔连接的流;如果不需要,请删除。
不幸的是,这种方法对于您的特定用例来说有点麻烦,因为bc
如果该表达式中间有换行符,则会失败:
$ echo "750/12.5" | bc | cat - <(echo "/24") | bc
60
(standard_in) 2: parse error
Run Code Online (Sandbox Code Playgroud)
您可以通过从原始结果中删除换行符来解决此问题bc
:
$ echo "750/12.5" | bc | tr -d '\n' | cat - <(echo "/24") | bc
2
Run Code Online (Sandbox Code Playgroud)
然而,我通过谷歌搜索“bash追加到管道”遇到了这个问题,就我而言,我实际上确实希望在连接之间使用换行符。因此,对于那些出于同样原因的人,请使用| cat - <(...)
:
$ echo foo | cat - <(echo bar)
foo
bar
$ echo foo | cat - <(echo bar) | sort | cat - <(echo last_line)
bar
foo
last_line
$ echo foo | cat - <(echo bar) | sort | cat <(echo header) - <(echo last_line)
header
bar
foo
last_line
Run Code Online (Sandbox Code Playgroud)
ImH*_*ere 12
在最简单的选项中,这确实附加到管道流:
$ echo "750/12.5" | { bc; echo "/24"; }
60
/24
Run Code Online (Sandbox Code Playgroud)
但是,它有一个意外的换行符,以避免您需要使用 tr:
$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24
Run Code Online (Sandbox Code Playgroud)
或者,鉴于命令扩展删除了尾随换行符这一事实:
$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24
Run Code Online (Sandbox Code Playgroud)
但可能,正确的方法应该类似于:
$ echo "$(echo "750/12.5" | bc )/24"
60/24
Run Code Online (Sandbox Code Playgroud)
其中,要在 bc 中使用,可以写成这样:
$ bc <<<"$(bc <<<"750/12.5")/24"
2
Run Code Online (Sandbox Code Playgroud)
其中,要获得合理的浮点数精度应该是这样的:
$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000
Run Code Online (Sandbox Code Playgroud)
请注意需要两个比例,因为有两个 bc 实例。
当然,一个 bc 实例只需要一个比例:
$ bc <<<"scale=5;750/12.5/24"
Run Code Online (Sandbox Code Playgroud)
实际上,您应该考虑的是字符串:
$ a=$(echo "750/12.5") # capture first string.
$ echo "$a/24" | bc # extend the string
2
Run Code Online (Sandbox Code Playgroud)
上面关于比例的评论在这里仍然有效。
像这样的事情似乎可以使用 xargs:
$ echo "750/12.5" | bc |xargs -I{} echo "{}+20" |bc
80
Run Code Online (Sandbox Code Playgroud)
甚至:
$ echo "750/12.5" | bc |echo "$(</dev/stdin)+20" |bc
80
Run Code Online (Sandbox Code Playgroud)
那么为何不 :
$ bc <<<20+$(bc <<<"750/12.5")
80
Run Code Online (Sandbox Code Playgroud)