这两种拆分方法在 bash 中有何不同?

How this two spliting method differs in bash?

我早些时候正在努力解决 bash 中的字符串拆分问题。经过一番搜索后,我发现了两种方法,即拆分字符串并制作拆分部分的数组。

但是当我打印它们时,我得到了不同的结果。

a="hello,hi,hola"

方法一:

IFS=',' read -ra arr <<< "$a"
echo "${arr[@]}"

输出:

hello hi hola

方法二:

arr=$(echo $a | tr "," "\n")
echo "${arr[@]}"

输出:

hello
hi
hola

这背后的原因是什么?

在您的方法 2 中,arr 不是数组。您需要:

arr=( $(echo $a | tr "," "\n") )

使其成为数组。

使用这种方法,如果您有连续的 space 个字符或 glob 字符,您将 运行 遇到问题。使用方法一,或者更好,

IFS=, read -r -d '' -a arr < <(printf '%s,[=11=]' "$a")

这是在 Bash 中拆分字符串的规范方式。参见 How do I split a string on a delimiter in Bash?