while 循环 bash 中变量的行

While-loop over lines from variable in bash

假设文件 file 包含多行。

$ cat file
foo
bar
baz

进一步假设我希望用 while 循环遍历每一行。

$ while IFS= read -r line; do
$   echo $line
$   # do stuff
$ done < file
foo
bar
baz

最后,请假设我希望传递存储在变量中的行而不是存储在文件中的行。如何在不收到以下错误的情况下遍历保存为变量的行?

$ MY_VAR=$(cat file)
$ while IFS= read -r line; do
$   echo $line
$   # do stuff
$ done < $(echo "$MY_VAR")
bash: $(echo "$MY_VAR"): ambiguous redirect

您有多种选择:

  • A herestring(注意这是一个非POSIX扩展):done <<<"$MY_VAR"
  • 一个 heredoc(POSIX 兼容,将与 /bin/sh 一起工作):

    done <<EOF
    $MY_VAR
    EOF
    
  • 进程替换(也是非 POSIX 扩展,但使用 printf 而不是 echo 使得它在支持它的 shell 中更容易预测;见POSIX spec for echo 中的应用程序使用说明):done < <(printf '%s\n' "$MY_VAR")


请注意,前两个选项(在 bash 中)将使用变量的内容在磁盘上创建一个临时文件,而最后一个选项使用 FIFO。

< 后面需要跟一个文件名。您可以使用此处的字符串:

done <<< "$MY_VAR"

或进程替换:

done < <(echo "$MY_VAR")