刚刚注意到一些我无法解释的奇怪现象:
当我使用 read -a
拆分我的 $PATH
变量时,一切正常
IFS=: read -r -a lines <<< "$PATH"
for line in "${lines[@]}"; do echo "$line"; done
但是当我尝试使用 while ... read
循环做同样的事情时,只打印第一行
while IFS=: read -r line; do echo "$line"; done <<< "$PATH"
最佳答案
您可以完成这项工作;从使用 IFS=:
切换到使用 -d:
,并将 :
附加到输入流的末尾:
while IFS= read -r -d: line; do echo "$line"; done <<< "$PATH:"
不同的是IFS
是用来寻找单词之间的边界,而read -r line
读入exactly one变量,line
,所以它根本不是在寻找多个单词。相比之下,-d
告诉每次 read
调用要停止的字符;默认情况下这是一个换行符,但您可以将其替换为任何其他单个字符。 (如果未找到该字符,read
将以非零状态退出;这就是为什么标准/惯用的 while read
循环习惯用法会跳过文件的最后一行,如果它不是' 以换行符正确终止,以及为什么我们在这里使用 $PATH:
作为我们的输入)。
另一方面,如果您运行 IFS=: read -r first second rest
,它会将您的第一个 PATH 条目放入$first
,第二个放入$second
,该行的剩余部分放入$rest
;而使用 IFS: read -r line
,就好像你只有一个项目,$rest
。
关于bash - 为什么将我的 $PATH 与 `read -r -a line` 分开工作但不能与 `while read -r line` 分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64342341/