ループ内の変数を複数の変数に分割

ループ内の変数を複数の変数に分割

このフォーラムで検索して別のコードを試していますが、うまく動作しないようです。

変数があります。

ip="192.168.1.227 192.168.1.205 192.168.1.217"

いいえ、各IPアドレスを異なる変数に分割したいと思います。

ip1=192.168.1.227
ip2=192.168.1.205
ip3=192.168.1.217

言葉で何かをしようとしています。

for ((word in $vds; i=0; i++));
do
echo $word
"ip$i"=$word
done

しかし、私はそれを動作させることはできません。

答え1

あなたがそうする可能性はほとんどありません実際に各個々のIP番号に別々の変数を割り当てたいと思います。 IP 番号をアレイに保存すると、管理が簡単になります。

ipnumbers=( $ip )

引用符のないこの使用は、$ip(変数のデフォルト値を想定してIFS)その値をスペースに分割し、結果の単語に対してファイル名ワイルドカードを呼び出しますが、データにファイル名ワイルドカードパターンがないため問題ありません。次に、分割された単語を配列の別々の要素として割り当てますipnumbers

次に(2番目の要素の場合)を使用して個々の要素にアクセスするか、"${ipnumbers[1]}"ループを使用して繰り返すことができます。

for ipnum in "${ipnumbers[@]}"; do ...; done 

答え2

配列変数を使用する方が良いです。

 readarray -t -d ' ' ips <<<"$ip"

*これはしばしば改行、グローバル文字(、、、?[]などに問題を引き起こす「引用されていない」シェル分割を使用しません。次に配列を印刷します。

 printf '%s\n'  "${ips[@]}"

またはループで使用してください。

for i in "${ips[@]}"; do
    echo "$i"
done

答え3

明らかに配列が好ましいアプローチですが、本当に別のバージョンが必要な場合は、ip$number次のことを試してください。

  • evalあなたのip$i=$word課題は参考資料を慎重に検討します(廃止予定の予防措置を念頭に置いてくださいeval)。
  • 小さなループは次のとおりです。for word in $ip; do read ip$((++CNT)) <<< $word; done

関連情報