myfreax

shell read文件

编写Bash脚本时,有时会遇到需要逐行读取文件的情况。例如您可能有一个文本文件

3 min read
By myfreax
shell read文件
shell read文件

编写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,然后通过逗号作为分隔符,拆分行为多个字符串分别变量distropm

while IFS=, read -r distro pm
do
  echo "$pm" is the package manager for "$distro"
done < distros.txt
distro-pm.sh
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
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

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读取循环的输入来逐行读取文件。如果您有任何问题或反馈,请随时发表评论。

Related Articles