4

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

2 回答 2

4

你有几个选择:

  • 一个herestring(注意这是一个非POSIX扩展):done <<<"$MY_VAR"
  • 一个heredoc(符合POSIX,将与/bin/sh)一起使用:

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


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

于 2017-06-26T20:04:16.513 回答
3

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

done <<< "$MY_VAR"

或过程替换:

done < <(echo "$MY_VAR")
于 2017-06-26T20:05:00.480 回答