在不使用标准循环的情况下从 bash 中的文件读取 - 非典型用例
Reading from a file in bash without using the standard loop - non-typical use case
我熟悉以下代码来读取文件的每一行并执行一些命令。
while read -r line; do
echo "$line"
done < filename
上面的循环是由文件中的每一行驱动的,循环中执行了一个操作块。
我有一个脚本,其中包含生成和控制线程的嵌套循环。我希望能够通过循环中的命令一次从文件中拉出一行,而不是让线构成循环。例如,在其他语言中,将有一个 fopen()
然后是一个 fread()
和一个 fclose()
到程序结束时要清理。 bash中是否有等价物?
我正在使用 Ubuntu 18.04 LTS 和 bash 4.4.20
在bash中,您可以使用'exec'命令打开文件。假设没有其他输入文件,您可以重定向标准输入。如果 stdin 用于其他用途,请考虑在不同的文件描述符(3、4、...)上打开文件。您不能使用 0、1 和 2,它们已经与 stdin/stdout/stderr.
相关联
使用标准输入:
exec < filename
read ...
if [ ... ] ; then
read ...
fi
# Close
exec <&-
使用不同的文件描述符
exec 3<filename
read -u3 ...
if [ ... ] ; then
read -u3 ...
fi
exec 3<&-
请注意,与其他环境不同,代码必须选择一个不同的文件描述符来使用,如果同时打开多个文件,这可能会很棘手。更好的解决方案,基于@wjandrea 评论
exec {myfile}<filename
read -u$myfile ...
if [ ... ] ; then
read -u$myfile ...
fi
exec $myfile<&-
我熟悉以下代码来读取文件的每一行并执行一些命令。
while read -r line; do
echo "$line"
done < filename
上面的循环是由文件中的每一行驱动的,循环中执行了一个操作块。
我有一个脚本,其中包含生成和控制线程的嵌套循环。我希望能够通过循环中的命令一次从文件中拉出一行,而不是让线构成循环。例如,在其他语言中,将有一个 fopen()
然后是一个 fread()
和一个 fclose()
到程序结束时要清理。 bash中是否有等价物?
我正在使用 Ubuntu 18.04 LTS 和 bash 4.4.20
在bash中,您可以使用'exec'命令打开文件。假设没有其他输入文件,您可以重定向标准输入。如果 stdin 用于其他用途,请考虑在不同的文件描述符(3、4、...)上打开文件。您不能使用 0、1 和 2,它们已经与 stdin/stdout/stderr.
相关联使用标准输入:
exec < filename
read ...
if [ ... ] ; then
read ...
fi
# Close
exec <&-
使用不同的文件描述符
exec 3<filename
read -u3 ...
if [ ... ] ; then
read -u3 ...
fi
exec 3<&-
请注意,与其他环境不同,代码必须选择一个不同的文件描述符来使用,如果同时打开多个文件,这可能会很棘手。更好的解决方案,基于@wjandrea 评论
exec {myfile}<filename
read -u$myfile ...
if [ ... ] ; then
read -u$myfile ...
fi
exec $myfile<&-