Shell-Script

如何POSIX-ly計算字元串變數中的行數?

  • November 21, 2019

我知道我可以在 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%.}"

引用自:https://unix.stackexchange.com/questions/482893