Shell-Script
如何POSIX-ly計算字元串變數中的行數?
我知道我可以在 Bash 中做到這一點:
wc -l <<< "${string_variable}"
基本上,我發現的一切都涉及
<<<
Bash 運算符。但是在 POSIX shell 中,
<<<
是未定義的,我已經好幾個小時找不到替代方法了。我很確定有一個簡單的解決方案,但不幸的是,到目前為止我還沒有找到它。
簡單的答案
wc -l <<< "${string_variable}"
是printf "%s\n" "${string_variable}" | wc -l
.實際上存在方式
<<<
和管道工作的差異:<<<
創建一個臨時文件作為輸入傳遞給命令,而|
創建一個管道。在 bash 和 pdksh/mksh(但不在 ksh93 或 zsh 中)中,管道右側的命令在子 shell 中執行。但在這種特殊情況下,這些差異並不重要。請注意,就行數而言,這假定變數不為空並且不以換行符結尾。當變數是命令替換的結果時,不以換行符結尾,所以在大多數情況下你會得到正確的結果,但你會得到 1 為空字元串。
var=$(somecommand); wc -l <<<"$var"
和之間有兩個區別somecommand | wc -l
:使用命令替換和臨時變數刪除最後的空白行,忘記輸出的最後一行是否以換行符結尾(如果命令輸出有效的非空文本文件,它總是如此) ,如果輸出為空,則多計一。如果你想同時保留結果和計數行,你可以通過附加一些已知的文本並在最後剝離它來做到這一點:output=$(somecommand; echo .) line_count=$(($(printf "%s\n" "$output" | wc -l) - 1)) printf "The exact output is:\n%s" "${output%.}"