编写Bash脚本时,有时会遇到需要逐行读取文件的情况。例如您可能有一个文本文件,其中包含由脚本处理的数据。
read
命令是bash内置命令,可从标准输入或者文件描述符中读取一行并将该行按空格拆分为多个字符串赋值给多个变量。
在本教程中,我们将讨论如何在Linux使用read命令逐行读取文件并分配给多个变量。
read 命令逐行读取文件
Shell的默认标准输入是键盘,但可以使用Shell重定向符号<
,修改标准输入为文件。
read命令默认仅接受标准输入,要使用read命令读取文件,必须使用重定向符号<
,重定向标准输入为文件。
例如命令while IFS= read -r line; do echo $line; done < input_file
将会使用文件作为标准输入。
read
命令逐行读取文件并将每一行分配给line
变量。处理完所有行后,while循环将会终止。
while read -r line; do echo $line; done < input_file
while read -r line
do
echo "$line"
done < input_file
read 命令逐行读取文件并拆分
假设当前目录存在文件distros.txt
,其中包含一些流行的Linux发行版及其软件包管理器的列表并使用逗号,
分隔。
read
命令除了可以逐行读取件,还可以逐行读取文件并拆分行为多个字符串赋值给多个变量。
第一个拆分的字符串分配给第一个变量,第二个拆分字符串分配给第二个变量,依此类推。
由于read
命令默认使用一个空格,制表符tab或者换行符作为拆分的分隔符。在本教程中,我们将修改read
命令的分隔符为逗号,
,通过设置IFS
变量。
Shell脚本distro-pm.sh将会逐行读取文件distros.txt
,然后通过逗号作为分隔符,拆分行为多个字符串分别变量distro
,pm
。
while IFS=, read -r distro pm
do
echo "$pm" is the package manager for "$distro"
done < distros.txt
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
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
read 命令HereDoc逐行读取文件
Here String是HereDoc的变体。(cat input_file )
将保留换行符。
while IFS= read -r line
do
echo "$line"
done <<< $(cat input_file )
read 命令文件描述符逐行读取文件
您还可以使用其它文件描述符重定向标准输入,使用文件描述符时,请使用4到9之间的数字,以避免与Shell内部文件描述符冲突。
while IFS= read -r -u9 line
do
echo "$line"
done 9< input_file
结论
在Bash中,我们可以通过提供文件名作为while读取循环的输入来逐行读取文件。如果您有任何问题或反馈,请随时发表评论。