私はDashがrPiで実行されているので、Dashを使用しています。バッシュはオプションではありません。
Dashで動作するようにBashスクリプトを再構築しています。可能なPOSIX規格(携帯用)にしたいです。問題は、Bashに関連していない複数行の文字列を繰り返す方法に関するヘルプを見つけるのが難しいことです。
私のスクリプトは、100〜1000のデバイスリストを繰り返す必要があるまで機能し、各デバイスはテキストファイルの1行に表示されます。たとえば、ファイルは次のようになります。
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
事実上無意味になります。一度に1つのデバイスしか処理できないため、1つの$ARRAY
単語だけを保存することが重要です。snmpbulkwalk
すべてのデータを複数行の文字列として返しますが、sed
各改行文字をコンマで置き換えることで簡単に処理できます。
だから、文字列の各単語を繰り返す正確で効率的な方法は何ですか?私が理解したのは、ダッシュには配列がほとんどないため、突然変異がはるかに難しくなります。使ってみました。Ubuntuガイドそして非常に便利な参考資料です。私はこの記事を書いてgrep
1行ずつ読み、別のforループを入れ子にする必要があるかもしれないと思い始めましたが、より簡単で「きれいな」方法があるかどうかはわかりません。
あなたは素晴らしいです!いくつかの例では、迅速かつクリーンな応答を提供します。
だから私は2つの異なるバージョンのスクリプトを作成し、両方とも完璧に動作しました。最初の作業はroaimaによって説明され、Steeldriverが提案したように行われました。ループをwhile
ファイルを1行ずつ読み取るループに置き換えました。ありがとうございます。これは作業を簡素化するのに非常に役立ち、私の場合は配列が必要ないことを示しています。
私の2番目のバージョンはちょうど交換され、printf "Getting VLANS for: $ARRAY"
最終的にecho "Getting VLANS for: $ARRAY"
何が起こるかを確認するために削除されました。とにかく、これはすべての違いを生み出します。つまり、残りのコードが正しく機能するようにするすべてをARRAY
含めないわけです。LIST
これがどのように機能するのかをより詳細に説明したい人がいる場合は、コメントでお知らせください。
もう一度ありがとうございます! Bashでは、以前よりはるかに速く実行されます。snmp
今残っているのは、データを解析するためにいくつかの調整を行うことです!
答え1
これがファイルから一度に1行ずつ読み取る方法です。
while IFS= read -r DEVICE
do
....
done < your_file