1

如果我想读取一个字符串并在给定的分隔符上拆分它,我可以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,例如有?

4

0 回答 0