1

単一の delimiter を使用して配列に変換したい複数行の文字列があり|ます。ただし、設定IFS=|すると、新しい行が表示される直前に停止します。

IFS='|' read -a VARS <<< "var1|var2|var3
                          var4|var5|var6
                          var7|var8|var9"

echo ${VARS[@]}
#output => var1 var2 var3

残りの行が評価されない理由と、それを防ぐ方法、新しい行の存在に関係なくすべての変数を割り当てることができるのは不思議です。

4

2 に答える 2

5

IFSto|\nuseを設定して-d、改行以外の別の区切り文字を使用します。また、価値観をそのまま維持する必要があります。スペースも含まれます。

IFS=$'|\n' read -d '' -a VARS <<< "var1|var2|var3
var4|var5|var6
var7|var8|var9"

readによって変更されない限り、デフォルトでは最初の改行文字までしか読み取れません-d。は、それに対する引数として''も同義です。$'\0'

もう一つのポイント

二重引用符内のスペース (改行を含む) は黙って無視されません。また、文字どおり値として含まれます。

したがって、おそらくあなたが本当にすべきことは次のとおりです。

IFS='|' read -a VARS <<< "var1|var2|var3|var4|var5|var6|var7|var8|var9"
于 2014-08-19T14:15:01.670 に答える
3

bash では、複数行の文字列を書き込むための適切な構文は次のとおりです。

IFS='|' read -a VARS <<< "var1|var2|var3 \
                          var4|var5|var6 \
                          var7|var8|var9"
echo ${VARS[@]}
#>var1 var2 var3 var4 var5 var6 var7 var8 var9

#However, you will have
echo "${VARS[@]}"
#>var1 var2 var3                           var4 var5 var6                           var7 var8 var9

|文字列を複数行の文字列として書き、スペースを完全に削除する場合は、既存のもの$IFSを削除する代わりに追加できます

IFS=$IFS'|' read -a VARS <<< "var1|var2|var3 \
                              var4|var5|var6 \
                              var7|var8|var9"
echo "${VARS[@]}"
#>var1 var2 var3 var4 var5 var6 var7 var8 var9
于 2014-08-19T14:17:01.463 に答える