我有以下。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 shell可能不知道read -u3;请使用read <&3代替。)

其他回答

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

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 shell可能不知道read -u3;请使用read <&3代替。)

许多人发布了一个过度优化的解决方案。我不认为这是不正确的,但我谦虚地认为,一个不那么优化的解决方案将是可取的,以使每个人都能轻松地理解这是如何工作的。以下是我的建议:

#!/bin/bash
#
# This program reads lines from a file.
#

end_of_file=0
while [[ $end_of_file == 0 ]]; do
  read -r line
  # the last exit status is the 
  # flag of the end of file
  end_of_file=$?
  echo $line
done < "$1"

Use:

filename=$1
IFS=$'\n'
for next in `cat $filename`; do
    echo "$next read from $filename" 
done
exit 0

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

#! /bin/bash
cat filename | while read LINE; do
    echo $LINE
done

使用下面的Bash模板应该允许您一次从文件中读取一个值并处理它。

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