在bash中读取文件而不使用标准循环-非典型用例

在bash中读取文件而不使用标准循环-非典型用例,bash,file,fopen,Bash,File,Fopen,我熟悉以下代码来读取文件的每一行并执行一些命令 while read -r line; do echo "$line" done < filename 读取-r行时;做 回音“$line” 完成

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

while read -r line; do
  echo "$line"
done < filename
读取-r行时
;做
回音“$line”
完成<文件名
上面的循环由文件中的每一行驱动,并在循环中执行一个操作块

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


我正在使用Ubuntu 18.04 LTS和bash 4.4.20,在bash中,您可以使用“exec”命令打开一个文件。假设没有其他输入文件,可以重定向stdin。如果STDIN用于其他内容,请考虑在不同的文件描述符(3, 4,…)上打开文件。不能使用0、1和2,它们已与stdin/stdout/stderr关联

使用标准输入法:

exec < filename

read ...
if [ ... ] ; then
    read ...
fi

# Close
exec <&-
execexec如果您对其他工具开放,您可以使用
sed
awk
。。。为此。否则,您可以将该功能封装在
bash
函数中。“代码必须选择一个不同的文件描述符来使用”-您可以为此使用命名描述符:
exec{in}@wjandrea了解新功能很好。我的造币厂19(bas 4.4)中没有这个。这是什么时候加的你能给我一个链接吗?真奇怪,我在Ubuntu上使用Bash4.3。。。这里有记录:。“每个重定向之前可能会有一个文件描述符编号,但之前可能会有一个
{varname}
”@wjandrea感谢指针。刚找到。这很容易错过——没有一个例子可以演示这种重定向。修改我的答案。。。
exec 3<filename

read -u3 ...
if [ ... ] ; then
    read -u3 ...
fi
exec 3<&-
exec {myfile}<filename

read -u$myfile ...
if [ ... ] ; then
    read -u$myfile ...
fi
exec $myfile<&-