在不使用标准循环的情况下,从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。如果stdin是用来做其他事情的,可以考虑在不同的文件描述符(3,4,...)上打开文件。你不能使用0、1和2,它们已经与stdinstdoutstderr相关联。

使用stdin。

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.