为什么我的行读取在 bash 中没有按预期工作?

Why is my line read not working as expected in bash?

我有以下代码:

script_list=$'1 a\n2\n3'
old_IFS="${IFS}"
IFS=$'\n'
for line in "${script_list}"; do
    echo "__${line}__";
done
IFS="${old_IFS}"

将产生:

__1 a__
__2__
__3__

然而,它给了我:

__1 a
2
3__

我双引号 "${script_list}" 因为它可以包含空格(参见:)。但我相信这也是问题所在,因为当我删除它周围的双引号时,它会按预期工作。

我错过了什么?

编辑: 正如 Cyrus 所建议的,我 运行 ShellCheck 的代码它告诉我:

$ shellcheck myscript
 
Line 5:
for line in "${script_list}"; do
            ^-- SC2066: Since you double quoted this, it will not word split, and the loop will only run once.

简单地删除双引号是否安全,或者我需要小心吗?

我双引号 "${script_list}" 因为它可以包含 spaces

这样做只是为了防止 shell 在 space 处拆分字符串。但是,您明确告诉 shell(通过设置 IFS)您的 IFS 现在是换行符,而不是 space。 shell 默认情况下会在换行符处拆分,而不是 spaces, 除非 你引用它。因此,删除引号。