我有一个简单的 bash 函数除以两个数字:
echo "750/12.5" | bc
我想从 中获取输出bc
并将结果附加/24
并通过管道传输到 的另一个实例bc
。
就像是:
echo "750/12.5" | bc | echo $1 + "/24" | bc
$1
管道结果在哪里。
PS我意识到我可以做的echo "750/12.5/24" | bc
问题更多是关于将文本附加到管道结果。
答案1
我使用sed
并替换了行尾来实现此目的:
echo "my text" | sed 's/$/ more text/'
返回:
my text more text
你的例子:
echo "750/12.5" | bc | sed 's/$/\/24/' | bc
答案2
替代方法:
TL;DR:用于cat
与 stdin ( -
) 作为参数连接。请注意,它会用换行符分隔连接的流;如果不需要,请删除。
不幸的是,这种方法对于您的特定用例来说有点麻烦,因为bc
如果该表达式中间有换行符,则会失败:
$ echo "750/12.5" | bc | cat - <(echo "/24") | bc
60
(standard_in) 2: parse error
您可以通过从原始结果中删除换行符来解决此问题bc
:
$ echo "750/12.5" | bc | tr -d '\n' | cat - <(echo "/24") | bc
2
然而,我通过谷歌搜索“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
答案3
在最简单的选项中,这确实附加到管道流:
$ echo "750/12.5" | { bc; echo "/24"; }
60
/24
然而,它有一个意外的换行符,为避免您需要使用 tr:
$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24
或者,考虑到命令扩展会删除尾随换行符:
$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24
但也许,正确的方法应该类似于:
$ echo "$(echo "750/12.5" | bc )/24"
60/24
如果要在 bc 中使用,可以写成这样:
$ bc <<<"$(bc <<<"750/12.5")/24"
2
其中,要获得合理的浮点数精度应该类似于:
$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000
请注意需要两个比例,因为有两个 bc 实例。
当然,一个 bc 实例只需要一个比例:
$ bc <<<"scale=5;750/12.5/24"
事实上,你应该考虑的是字符串:
$ a=$(echo "750/12.5") # capture first string.
$ echo "$a/24" | bc # extend the string
2
上面关于规模的评论在这里仍然有效。
答案4
您可以使用awk
向管道插入/附加任何内容:
$ date | awk 'BEGIN{print "prefix line"} {print} END{print "suffix line"}'
prefix line
Mo 21. Aug 15:24:30 CEST 2023
suffix line
在哪里
date
- 是您的输入管道(例如此处的当前日期)BEGIN{print "prefix line"}
- 该块将在 main 之前插入输出{print}
- 打印输入管道的内容;如果需要的话可以在这里做一些处理END{print "suffix line"}
- 这会在 main 之后附加输出
要在单行中执行相同的操作,只需使用printf
:
$ date | awk 'BEGIN{printf("prefix line >> ")} {printf($0)} END{printf(" << suffix line")}'
prefix line >> Mo 21. Aug 15:32:08 CEST 2023 << suffix line/upload/sc505enb/tmp>
$ echo "750/12.5" | bc | awk '{printf($0)} END{printf("/24\n")}'
60/24