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")
假设文件 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 forecho
中的应用程序使用说明):done < <(printf '%s\n' "$MY_VAR")
请注意,前两个选项(在 bash 中)将使用变量的内容在磁盘上创建一个临时文件,而最后一个选项使用 FIFO。
<
后面需要跟一个文件名。您可以使用此处的字符串:
done <<< "$MY_VAR"
或进程替换:
done < <(echo "$MY_VAR")