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 回答