この文字列を変数に保存します:
IN="[email protected];[email protected]"
ここで、文字列を;
区切り文字で分割して、次のようになります。
ADDR1="[email protected]"
ADDR2="[email protected]"
ADDR1
および変数は必ずしも必要ではありませんADDR2
。それらが配列の要素であれば、さらに良いでしょう。
以下の回答からの提案を受けて、私が求めていたのは次のものになりました。
#!/usr/bin/env bash
IN="[email protected];[email protected]"
mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do
echo "> [$addr]"
done
出力:
> [[email protected]]
> [[email protected]]
解決策としては、内部フィールドセパレータ(IFS) に;
。その回答で何が起こったのかわかりません。IFS
デフォルトに戻すにはどうすればよいですか?
RE:IFS
解決策、これを試してみたところ、うまくいきました。古いものを保持してIFS
、それを復元します。
IN="[email protected];[email protected]"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
echo "> [$x]"
done
IFS=$OIFS
ちなみに、私が試したとき
mails2=($IN)
ループで印刷すると最初の文字列のみが取得され、括弧なしでも$IN
機能します。
ベストアンサー1
設定できるのは内部フィールドセパレータ(IFS) 変数を解析して配列に格納します。コマンド内でこの処理が行われると、IFS
そのコマンドの環境 ( read
) への割り当てのみが行われます。次に、変数値に従って入力を解析してIFS
配列に格納し、これを反復処理します。
この例では、 で区切られた 1 行の項目を解析し;
、配列にプッシュします。
IFS=';' read -ra ADDR <<< "$IN"
for i in "${ADDR[@]}"; do
# process "$i"
done
この他の例は、 のコンテンツ全体を処理するためのもので$IN
、入力の 1 行が で区切られるたびに;
、
while IFS=';' read -ra ADDR; do
for i in "${ADDR[@]}"; do
# process "$i"
done
done <<< "$IN"