撰写Bash脚本时,有时候也会遇到务必一行行读取文件的情况。例如,您可能有一个文本文档,主要包括须经脚本克服的信息。在教学中,我们在这里探讨如何在Bash中一行行读取文件。
一行行读取文件语法
一行行读取文件最通用性语法如下所示:
while IFS= read -r line
do
echo "$line"
done < input_file
闭合电路的单行线版本信息:
while IFS= read -r line; do echo $line; done < input_file
这也是如何运行的?
输入文件(input_file
就是你要启动的文档的名称,以依据read
命令加载。read
命令一行行读取文件,然后把每一行分到line
变量。处理完毕所有行后,while循环将终止。内部构造字段分节符(IFS
设成空字符串,以储存流板追随空格符,那也是read
命令的默认行为。
一行行读取文件案例
让我们看看下面的例子。假设我们有一个名字叫做文档,distros.txt
主要包括一些最流行的Linux发行版及其手机app包管理器的文件目录,并用分号(,
分隔:
distros.txt
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
要一行行读取文件,可以在终端中运行以下编号:
while IFS= read -r line
do
echo "$line"
done < distros.txt
编号将一行行读取文件,将每一行分到一个变量,接着回显该变量。大部分而言,我们将看到与应用cat指令显示文件主要内容一样的输出。
如果想想打印出运用apt的发行版应该怎么办?一种方法采用的是if语句,并检查这一家金融机构是否包含apt 子字符串:
while IFS= read -r line
do
if [[ "$line" == *"apt"* ]]; then
echo "$line"
fi
done < distros.txt
Ubuntu,apt
Debian,apt
一行行读取文件时,您还可以将好多个变量传递给read命令,该命令将按照将这一家金融机构拆分为好多个字段IFS
。第一个字段分到第一个变量,第二个字段分到第二个变量,依此类推。倘若字段超出变量,则剩余字段将分到最后一个变量。
在下文的例子中,大伙儿IFS设成分号(,
和依据2个变量distro
和pm
加载命令。从行的一直到第一个分号的相关内容都将分到第一个变量(distro
,而行的其余部分将分到第二个变量(pm
:
while IFS=, read -r distro pm
do
echo "$pm" is the package manager for "$distro"
done < distros.txt
apt is the package manager for Ubuntu
apt is the package manager for Debian
yum is the package manager for CentOS
pacman is the package manager for Arch Linux
dnf is the package manager for Fedora
替代文件读取方法
操作步骤替代
全过程拆换使大家能将命令的输出作为文件名传输:
while IFS= read -r line
do
echo "$line"
done < <(cat input_file )
运用here字符串数组
Here String是Here文档的组成。该字符串数组(cat input_file )
将储存回车符:
while IFS= read -r line
do
echo "$line"
done <<< $(cat input_file )
运用文件描述符
您还可以运用文件描述符将输入发放到循环:
while IFS= read -r -u9 line
do
echo "$line"
done 9< input_file
运用文件描述符时,挑选4到9之间数据信息,以避免与Shell内部构造文件描述符分歧。
结论
在Bash中,我们可以通过给与文件名作为while加载周而复始输入来一行行读取文件。
如果您有任何问题或意见和建议,请随时。
