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



我有以下代码:

script_list=$'1 an2n3'
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}",因为它可以包含空格(请参见:https://stackoverflow.com/a/10067297)。但我相信这也是问题所在,因为当我去掉它周围的双引号时,它会像预期的那样工作。

我错过了什么?

编辑:正如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.

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

I双引号"{script_list}";因为它可以包含空格

这样做只是为了防止shell在空格处拆分字符串。然而,您明确地告诉shell(通过设置IFS(您的IFS现在是一个换行符,而不是一个空格。默认情况下,shell将在换行符上拆分,而不是在空格上拆分,除非引用它。因此,请删除引号。

最新更新