繰り返す必要がある複数行の文字列がありますが、bashを使用しません。提案?

繰り返す必要がある複数行の文字列がありますが、bashを使用しません。提案?

私は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ガイドそして非常に便利な参考資料です。私はこの記事を書いてgrep1行ずつ読み、別の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

おすすめ記事