while 循环 bash 中变量的行

Mic*_*udl 6 bash heredoc while-loop herestring

假设一个文件file有多行。

$ cat file
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

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

$ while IFS= read -r line; do
$   echo $line
$   # do stuff
$ done < file
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*ffy 6

您有多种选择:

  • 这里的字符串(请注意,这是一个非 POSIX 扩展):done <<<"$MY_VAR"
  • Heredoc(符合 POSIX 标准,将与 一起使用/bin/sh):

    done <<EOF
    $MY_VAR
    EOF
    
    Run Code Online (Sandbox Code Playgroud)
  • 进程替换(也是一个非 POSIX 扩展,但使用printf而不是使其在支持它的 shell 中更具可预测性;请参阅POSIX 规范echo中的应用程序使用说明):echodone < <(printf '%s\n' "$MY_VAR")


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


Bar*_*mar 5

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

done <<< "$MY_VAR"
Run Code Online (Sandbox Code Playgroud)

或过程替换:

done < <(echo "$MY_VAR")
Run Code Online (Sandbox Code Playgroud)