我有以下代码:
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将在换行符上拆分,而不是在空格上拆分,除非引用它。因此,请删除引号。