如果我想读取一个字符串并在给定的分隔符上拆分它,我可以IFS
在一个数组中设置和存储字符串切片。然后我可以对它的项目做任何我想做的事情:
while IFS=_ read -r -a myarray; do
printf "%s -\n" "${myarray[@]}"
done <<< "a_b"
这将返回:
$ while IFS=_ read -r -a myarray; do echo "hello"; printf "%s -\n" "${myarray[@]}"; done <<< "a_b"
hello
a -
b -
但是,有时我只想在每个循环中读取其中一个字段。所以我想知道是否有一种方法可以让这个while
循环每次都由一个切片提供。也就是说,在第一次迭代中read
获得了 just a
,在第二次迭代中获得了 just b
,依此类推。
我找到了一种方法来改变我们提供循环的方式:相反<<< "a_b"
,我用一个新行tr
替换每个来拆分它:_
< <(tr "_" "\n" <<<"a_b")
$ while IFS=_ read -r -a myarray; do echo "hello"; printf "%s -\n" "${myarray[@]}"; done < <(tr "_" "\n" <<<"a_b")
hello
a -
hello
b -
但是,我想知道:还有其他方法吗?由于我们必须IFS
更改字段分隔符,Bash 是否有任何其他变量来设置“记录分隔符” awk
,例如有?