Bash

如何使 bash 內置“讀取”忽略註釋或空行?

  • February 22, 2021

(為簡單起見,我假設要讀取的文件是第一個參數 - $1。)

我可以在外部做我想做的事:

tempfile=$(mktemp)
awk '/^#/ {next}; NF == 0 {next}; {print}' "$1" > $tempfile
while read var1 var2 var3 var4 < $tempfile; do
 # stuff with var1, etc.
done

awk但是,每次解析配置文件時都需要呼叫似乎很荒謬。有沒有一種方法可以read忽略文件中的註釋行或僅空白行,而不會出現外部二進製文件/潛在的性能問題?


到目前為止的答案非常有幫助!澄清一下,我不想使用臨時文件,但我確實從文件中讀取配置,而不是從標準輸入中讀取配置。我很清楚我可以在呼叫腳本時使用輸入重定向,但是由於各種原因,在我的情況下不起作用。

我想對輸入進行軟編碼以讀取,例如:

configfile="/opt/myconfigfile.txt"
[ $# -gt 0 ] && [ -r "$1" ] && configfile="$1"

while read var1 var2 var3 var4 < "$configfile" ; do
 ...

configfile但是當我嘗試這個時,它只是一遍又一遍地讀取第一行,直到我終止程序。

也許這應該是它自己的問題……但這可能是我正在做的單行更改。我的錯誤在哪裡?

您不需要臨時文件來執行此操作,並且 sed(或 awk)在註釋處理方面比 shell case 語句靈活得多。

例如:

configfile='/opt/myconfigfile.txt'
[ $# -gt 0 ] && [ -r "$1" ] && configfile="$1"

sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "$configfile" |
   while read var1 var2 var3 var4; do
     # stuff with var1, etc.
   done

這會去除註釋(帶或不帶前導空格)並從輸入中刪除空行,然後再將其輸送到 while 循環中。它自己處理行註釋和附加到行尾的註釋:

# full-line comment
# var1 var2 var3 var4
abc 123 xyz def # comment here

呼叫sedawk執行這樣的任務並不“荒謬”,這是完全正常的。這就是這些工具的用途。至於性能,我敢打賭,除了非常小的輸入文件之外,sed版本會快得多。管道到sed有一些啟動成本,但執行速度非常快,而 shell 很慢。

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