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