IFS等于换行符在bash中不起作用

IFS等于换行符在bash中不起作用,bash,ifs,Bash,Ifs,我有一个多行字符串,我想根据\n对其设置IFS=$'\n',但它不起作用,我还尝试了IFS=和IFS=” “但运气不好。 下面是示例代码 IFS=$'\n' read -ra arr <<< "line1\nline2\nline3" printf "%s\n" "${arr[@]}" # it only generates array of length 1 有人能指出明显的问题吗。来自bash手册的bash内置部分: 阅读 并且可以使用-d -迪利姆酒店 请注意,后跟一个

我有一个多行字符串,我想根据
\n
对其设置
IFS=$'\n'
,但它不起作用,我还尝试了
IFS=
IFS=”
“
但运气不好。 下面是示例代码

IFS=$'\n' read -ra arr <<< "line1\nline2\nline3"
printf "%s\n" "${arr[@]}"
# it only generates array of length 1

有人能指出明显的问题吗。

来自bash手册的bash内置部分:

阅读

并且可以使用
-d

-迪利姆酒店

请注意,后跟一个空参数
-d'
,行分隔符将是nul字符,如果输入中没有nul字符,则可以使用它读取整个输入

但是,即使使用
-r
模式,读取速度也很慢

对于较大的输入,可以使用分词来更快地解决问题:

input=$'line1\nline2\nline3'
IFS=$'\n';set -f;arr=($input);set +f;IFS=$' \t\n'

注意
设置-f
以避免全局匹配阶段。

来自bash手册的bash内置部分:

阅读

并且可以使用
-d

-迪利姆酒店

请注意,后跟一个空参数
-d'
,行分隔符将是nul字符,如果输入中没有nul字符,则可以使用它读取整个输入

但是,即使使用
-r
模式,读取速度也很慢

对于较大的输入,可以使用分词来更快地解决问题:

input=$'line1\nline2\nline3'
IFS=$'\n';set -f;arr=($input);set +f;IFS=$' \t\n'

注意
设置-f
以避免全局匹配阶段。

您尝试的主要问题是没有使用字符串进行分词。来自man bash:

这将导致您的行按需要保存,例如,输出将为:

readarray -t arr << EOF
line1
line2
line3
EOF
declare -p arr
declare -a arr='([0]="line1" [1]="line2" [2]="line3")'
另一种选择是使用进程替换,并让
printf
提供拆分,例如

readarray -t arr < <(printf "line1\nline2\nline3\n")

readarray-t arr<您尝试的主要问题是没有使用字符串进行分词。来自man bash:

这将导致您的行按需要保存,例如,输出将为:

readarray -t arr << EOF
line1
line2
line3
EOF
declare -p arr
declare -a arr='([0]="line1" [1]="line2" [2]="line3")'
另一种选择是使用进程替换,并让
printf
提供拆分,例如

readarray -t arr < <(printf "line1\nline2\nline3\n")

如果命令成功,
readarray-t arr
将产生相同的结果。如何准确地确定数组的大小?您提供了一个带引号的字符串,例如,
'line1\nline2\nline3'
,将不会发生分词。@tripleee by
echo${arr[@]}
结果是
1
@DavidC.Rankin,编辑的问题仍然是相同的结果,没有得到拆分。问题是您没有实际读取输入,您提供的是字符串,无论是单引号还是双引号,都不会发生分词。默认的
IFS
“\t\n”
空格选项卡换行符
),因此无需更改
IFS
。这是shell如何处理文本的一个怪癖。此外,您只阅读了一次。您似乎想使用
readarray
mapfile
而不是
read-a
。您还可能将
-a
-a-d'\n'
混淆,因为您希望将分隔符指定为
'\n'
。如果命令成功,
printf
将产生相同的结果。如何准确地确定数组的大小?您提供了一个带引号的字符串,例如,
'line1\nline2\nline3'
,将不会发生分词。@tripleee by
echo${arr[@]}
结果是
1
@DavidC.Rankin,编辑的问题仍然是相同的结果,没有得到拆分。问题是您没有实际读取输入,您提供的是字符串,无论是单引号还是双引号,都不会发生分词。默认的
IFS
“\t\n”
空格选项卡换行符
),因此无需更改
IFS
。这是shell如何处理文本的一个怪癖。此外,您只阅读了一次。您似乎想使用
readarray
mapfile
而不是
read-a
。您还可能将
-a
-a-d'\n'
混淆,因为您要将分隔符指定为
'\n'