我有以下. 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 -u3
; read <&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