防止IFS停在新线路上

时间:2014-08-19 14:05:52

标签: bash shell unix ifs

我有一个多行字符串,我想通过使用单个分隔符|将其转换为数组。但是,设置IFS=|时,它会在新行出现之前停止:

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

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

我想知道为什么剩下的行不会被评估以及如何防止这种情况发生,无论是否存在新行,都可以分配每个变量?

2 个答案:

答案 0 :(得分:4)

IFS设置为|\n并使用-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"

答案 1 :(得分: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