Shell-Script

我有一個需要迭代的多行字元串,但我沒有使用 bash。建議?

  • April 23, 2015

我正在使用 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

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