在不使用标准循环的情况下从bash中读取文件-非典型用例

问题描述 投票:0回答:1

我熟悉以下代码来读取文件的每一行并执行一些命令。

while read -r line; do
  echo "$line"
done < filename

上述循环由文件中的每一行驱动,并在循环中执行了一组操作。

我有一个带有嵌套循环的脚本,可以生成并控制线程。我希望能够通过循环中的命令一次从文件中拉出一条线,而不是让线框成为循环。例如,在其他语言中,要清除的程序末尾将有fopen(),然后是fread()fclose()。 bash是否有等效功能?

我正在使用Ubuntu 18.04 LTS和bash 4.4.20

bash file fopen
1个回答
1
投票

在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<&-
© www.soinside.com 2019 - 2024. All rights reserved.