小编典典

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

all

我有以下 .txt 文件:

Marco
Paolo
Antonio

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

  • 从文件中读取第一行
  • 分配$name=“马可”
  • 做一些任务$name
  • 从文件中读取第二行
  • 分配$name=“保罗”

阅读 110

收藏
2022-03-01

共1个答案

小编典典

下面逐行读取作为参数传递的文件:

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"

如果将以上内容保存到具有 filename 的脚本中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 ]]如果最后一行不以 a 结尾,则防止它被忽略\n(因为read在遇到 EOF 时返回非零退出代码)。

如果循环内的命令也从标准输入读取,则使用的文件描述符read可能会变成其他东西(避免使用标准文件描述符),例如:

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

(非 Bash shell 可能不知道read -u3;请read <&3改用。)

2022-03-01