我有一個需要迭代的多行字元串,但我沒有使用 bash。建議?
我正在使用 Dash,因為這是在我的 rPi 上執行。Bash 不是一個選項。
我正在重寫一個 Bash 腳本以使用 Dash。我希望使其盡可能符合 POSIX 標準(便攜)。問題是很難找到關於如何通過不涉及 Bash 的多行字元串進行循環的幫助。
我的腳本一直有效,直到我必須瀏覽一個包含 100 到 1000 個設備的列表,每個設備在文本文件中各自的行中。例如,該文件可能類似於:
foo bar device blah
我正在使用一個簡單的
cat
命令導入單詞:LIST="$(cat $2)"
. 從這裡我需要遍歷每個單詞$LIST
:for ARRAY in ${LIST} do printf "Getting VLANS for: $ARRAY" VLANS=$(snmpbulkwalk -v 2c -t 2 -r 3 -c "$COMMUNITY" "$ARRAY.dcs.byu.edu" XIRRUS-MIB::vlanName -Oqv) printf "$ARRAY,$VLANS" >> "$REPORT" done
當循環開始時,
$ARRAY
幾乎會列印出所有內容,$LIST
從而有效地使其毫無意義。$ARRAY
由於snmpbulkwalk
一次只能處理一個設備,因此只儲存一個單詞至關重要。它將所有數據作為一個多行字元串返回,但是可以使用sed
逗號替換每個換行符來輕鬆處理。那麼,**迭代字元串中每個單詞的正確和/或有效方法是什麼?**據我了解,數組在 Dash 中相當不存在,這使得突變更加困難。我試過使用Ubuntu 指南和這個非常有用的參考。當我寫這篇文章時,我開始認為我可能不得不嘗試使用
grep
逐行讀取並嵌套另一個 for 循環,但我不確定是否有更簡單、“乾淨”的方式。你們太棒了!快速、清晰的響應和一些範例。
因此,我創建了兩個不同版本的腳本,它們都可以完美執行。第一個是按照 roaima 的概述完成的,也是 steeldriver 建議的。我用一個循環替換了我的循環,
while
而不是逐行讀取我的文件。謝謝你,這肯定有助於簡化事情,並表明在我的情況下不需要數組。我的第二個版本只是替換
printf "Getting VLANS for: $ARRAY"
為echo "Getting VLANS for: $ARRAY"
,最終我只是刪除了它,看看會發生什麼。不知何故,這一切都不同了:ARRAY
沒有包含LIST
允許其餘程式碼正常工作的所有內容。如果有人想進一步澄清這是如何工作的,請在評論中這樣做。再次感謝各位!它的工作速度比以前在 Bash 上要快得多。剩下的就是解析數據的更多調整
snmp
!
這就是我一次從文件中讀取一行的方式
while IFS= read -r DEVICE do .... done < your_file