附加到管道并传递?

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)

  • 这不适用于多行文本输入。就我而言,我想在多行文本中附加一行并对其进行处理。最终使用:(figlet my_text && echo "new line") | 盒子 (2认同)

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)

上面关于比例的评论在这里仍然有效。

  • @Gilles A `{…}` **很简单。答案是向用户展示“命令替换”作为最佳解决方案。再读一遍。 (2认同)

Geo*_*iou 5

像这样的事情似乎可以使用 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)