这两种拆分方法在 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?。
我早些时候正在努力解决 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?。