协慌网

登录 贡献 社区

逐行读取文件,将值分配给变量

我有以下. txt 文件:

Marco
Paolo
Antonio

我想逐行阅读它,并且我想为每行分配一个. txt 行值给一个变量。假设我的变量是$name ,流程是:

  • 从文件中读取第一行
  • 分配$name =“Marco”
  • $name做一些任务
  • 从文件中读取第二行
  • 分配$name =“Paolo”

答案

以下内容逐行读取作为参数传递的文件:

while IFS= read -r line; do
    echo "Text read from file: $line"
done < my_filename.txt

这是在循环中从文件读取行的标准格式。解释:

  • IFS= (或IFS='' )可防止对前导 / 尾随空格进行修剪。
  • -r防止反斜杠转义被解释。

或者,您可以将其放在 bash 文件帮助程序脚本中,示例内容:

#!/bin/bash
while IFS= read -r line; do
    echo "Text read from file: $line"
done < "$1"

如果以上内容保存到文件名为readfile的脚本中,则可以按以下方式运行:

chmod +x readfile
./readfile filename.txt

如果该文件不是标准的 POSIX 文本文件(= 不以换行符终止),则可以修改循环以处理尾随的分行:

while IFS= read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
done < "$1"

在这里, || [[ -n $line ]]防止最后一行不以\n结尾的情况被忽略(因为read遇到 EOF 时返回非零退出代码)。

如果循环内的命令也从标准输入中读取,则read所使用的文件描述符可能会出现其他情况(避免使用标准文件描述符),例如:

while IFS= read -r -u3 line; do
    echo "Text read from file: $line"
done 3< "$1"

(非 Bash 外壳程序可能不知道read -u3read <&3 。)

我鼓励您使用-r标志进行read ,它代表:

-r  Do not treat a backslash character in any special way. Consider each
    backslash to be part of the input line.

我是从man 1 read引用的。

另一件事是将文件名作为参数。

这是更新的代码:

#!/usr/bin/bash
filename="$1"
while read -r line; do
    name="$line"
    echo "Name read from file - $name"
done < "$filename"

使用以下 Bash 模板应该可以让您一次从文件中读取一个值并进行处理。

while read name; do
    # Do what you want to $name
done < filename