bash - 为什么将我的 $PATH 与 `read -r -a line` 分开工作但不能与 `while read -r line` 分开?

标签 bash

刚刚注意到一些我无法解释的奇怪现象:

当我使用 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/

相关文章:

bash - Grep 没有任何前导字符的精确行

bash - 无法在 shell 脚本中转义引号

linux - 如何正确同时执行多个f90代码?

仅当通过 Bash 脚本运行时 Mysql 才会出错

Linux - 从第二个选项卡获取文本

bash - 如何关闭并重新打开Docker终端

linux - awk 不打印分隔符

bash - 遍历跳过第一个参数

php - shell heredoc inside php heredoc

bash - 找不到文件时sftp避免退出