
我有一個簡單的 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