我有一个多行字符串,我想通过使用单个分隔符|
将其转换为数组。但是,设置IFS=|
时,它会在新行出现之前停止:
IFS='|' read -a VARS <<< "var1|var2|var3
var4|var5|var6
var7|var8|var9"
echo ${VARS[@]}
#output => var1 var2 var3
我想知道为什么剩下的行不会被评估以及如何防止这种情况发生,无论是否存在新行,都可以分配每个变量?
答案 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