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

我有以下. txt文件:

MarcoPaoloAntonio

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

  • 从文件中读取第一行
  • 赋值$name="Marco"
  • $name做一些任务
  • 从文件中读取第二行
  • 分配$name="Paolo"
1958257 次浏览

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

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

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

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

或者你可以把它放在bash文件助手脚本中,示例内容:

#!/bin/bashwhile IFS= read -r line; doecho "Text read from file: $line"done < "$1"

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

chmod +x readfile./readfile filename.txt

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

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

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

如果循环内的命令也从标准输入读取,则read使用的文件描述符可以偶然用于其他内容(避免标准文件描述符),例如:

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

(非Bash shell可能不知道read -u3;使用read <&3代替。)

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

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

我鼓励您使用-r标志表示read,代表:

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

我引用了man 1 read

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

以下是更新的代码:

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

用途:

filename=$1IFS=$'\n'for next in `cat $filename`; doecho "$next read from $filename"doneexit 0

如果你以不同的方式设置IFS,你会得到奇怪的结果。

#! /bin/bashcat filename | while read LINE; doecho $LINEdone

如果您需要处理输入文件和用户输入(或来自stdin的任何其他内容),请使用以下解决方案:

#!/bin/bashexec 3<"$1"while IFS='' read -r -u 3 line || [[ -n "$line" ]]; doread -p "> $line (Press Enter to continue)"done

基于公认的答案bash黑客重定向教程

在这里,我们为作为脚本参数传递的文件打开文件描述符3,并告诉read使用此描述符作为输入(-u 3)。因此,我们将默认输入描述符(0)附加到终端或其他输入源,能够读取用户输入。

很多人发布了一个过度优化的解决方案。我不认为这是错误的,但我谦卑地认为,一个不太优化的解决方案将是可取的,让每个人都能轻松理解这是如何工作的。这是我的建议:

#!/bin/bash## This program reads lines from a file.#
end_of_file=0while [[ $end_of_file == 0 ]]; doread -r line# the last exit status is the# flag of the end of fileend_of_file=$?echo $linedone < "$1"

对于正确的错误处理:

#!/bin/bash
set -Eetrap "echo error" EXITtest -e ${FILENAME} || exitwhile read -r linedoecho ${line}done < ${FILENAME}

以下将只打印出文件的内容:

cat $Path/FileName.txt
while read line;doecho $linedone

在bash中使用IFS(内部字段分隔符)工具,定义用于将行分隔为标记的字符,默认包括<选项卡>/<空间>/<newLine>

步骤1:加载文件数据并插入列表:

# declaring array list and index iteratordeclare -a array=()i=0
# reading file in row mode, insert each line into arraywhile IFS= read -r line; doarray[i]=$linelet "i++"# reading from file pathdone < "<yourFullFilePath>"

步骤2:现在迭代并打印输出:

for line in "${array[@]}"doecho "$line"done

数组中的回声特定索引:访问数组中的变量:

echo "${array[0]}"