我熟悉下面的代码,读取文件中的每一行并执行一些命令。
while read -r line; do
echo "$line"
done < filename
上面的循环是由文件中的每一行驱动的,在循环中执行一个操作块。
我有一个带有嵌套循环的脚本,这些循环会产生和控制线程。 我希望能够在循环中通过命令从文件中一次拉出一行,而不是让行框住循环。 例如,在其他语言中,会有一个叫做 fopen()
那么 fread()
和一个 fclose()
在程序结束时进行清理。 在bash中有没有类似的方法?
我使用的是Ubuntu 18.04 LTS和bash 4.4.20。
在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<&-