【问题标题】:Why is my line read not working as expected in bash?为什么我的行在 bash 中没有按预期工作?
【发布时间】:2021-08-22 04:10:30
【问题描述】:

我有以下代码:

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}" 因为它可以包含空格(请参阅: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.

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

【问题讨论】:

  • 你问Why is my line read not working as expected in bash?所以你有答案Since you double quoted this, it will not word split, and the loop will only run once。 || Is it safe to simply remove the double quotes or do I need to be careful with that? 定义“安全”。它将是“安全的”,因为循环将执行。但请注意文件名扩展。 ||你是在问 XY 问题吗?
  • 只要 script_list 不包含通配符,它​​就是安全的。但我不知道你在那里做什么。你为什么需要这个?有什么意义?

标签: bash shell git-bash


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-02-29
  • 2019-08-28
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2021-01-03
相关资源
最近更新 更多