我目前有一个bash
变量,它保存与此类似的字符串,
其中每个不同的短语由换行符分隔:
var="1st word
2nd word
4th word"
"2nd word"
注意和之间有一个空格"4th word"
。
我想将这些短语放入数组中,将空字符串保留在第二个索引中:
arr=("1st word" "2nd word" "" "4th word")
我尝试了以下代码,但它似乎忽略了空白区域。
IFS=$'\n' read -rd '' -a arr <<<"$var"
有人碰巧有解决这个问题的方法吗?
谢谢。
答案1
您的方法的问题在于它依赖于使用IFS 空白字符(即换行符)。如中所述man bash
:
Any character in IFS that is not IFS whitespace,
along with any adjacent IFS whitespace characters, delimits a field. A
sequence of IFS whitespace characters is also treated as a delimiter.
因此,无论您传递给 , 的任何选项read
,"$var"
都已被拆分为 3 个标记,将空的第三行两侧的相邻换行符视为单个分隔符。
从 bash 版本 4.0 开始,您可以使用readarray
(或其同义词mapfile
)来读取整行:
$ var="1st word
2nd word
4th word"
$ readarray -t arr <<<"$var"
$ declare -p arr
declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")
如果您的 bash 太旧而无法提供readarray
/ mapfile
,那么您可以使用循环来完成:
$ arr=()
$ while IFS= read -r line; do arr+=("$line"); done <<<"$var"
$ declare -p arr
declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")