同时循环来自bash变量的行

时间:2017-06-26 20:01:39

标签: bash while-loop heredoc herestring

假设文件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

2 个答案:

答案 0 :(得分:2)

您有几种选择:

  • 一个herestring(请注意,这是一个非POSIX扩展名):done <<<"$MY_VAR"
  • 一个heredoc(符合POSIX标准,适用于/bin/sh):

    done <<EOF
    $MY_VAR
    EOF
    
  • 进程替换(也是非POSIX扩展,但使用printf而非echo使其在支持它的shell中更具可预测性;请参阅{{中的APPLICATION USAGE说明3}}):done < <(printf '%s\n' "$MY_VAR")

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

答案 1 :(得分:1)

<后面需要一个文件名。你可以使用here-string:

done <<< "$MY_VAR"

或流程替换:

done < <(echo "$MY_VAR")