我有一个像LINE=foo,bar,,baz
这样的变量
我尝试使用两种不同的技术将其与分隔符 ,
分开:
array=(${LINE//,/})
array=($(echo "$LINE"| tr ',' '\n'))
echo ${array[2]}
应该返回一个空值,但它返回 baz
(两者都将 baz 视为第三个值,而实际上它应该是第四个值。)
最佳答案
您可以使用 read -a
和备用分隔符来执行此操作:
IFS=, read -a array <<<"$LINE"
请注意,由于对 IFS
的赋值是 read
命令的前缀,因此它仅适用于该命令,您不必将其设置回去之后就正常了。此外,与依赖于未引用变量的分词的那些不同,它不会尝试将任何看起来像文件名通配符的条目“扩展”到匹配文件列表中。
演示:
$ LINE=foo,bar,,baz
$ IFS=, read -a array <<<"$LINE"
$ declare -p array
declare -a array='([0]="foo" [1]="bar" [2]="" [3]="baz")'
关于由分隔符分割的 bash 字符串在空值时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73698670/