我有以下。txt文件:
Marco
Paolo
Antonio
我想逐行读取它,对于每一行,我想为一个变量分配一个.txt行值。假设我的变量是$name,流是:
读取文件的第一行 分配$name = "Marco" 使用$name执行一些任务 从文件中读取第二行 指定$name = "Paolo"
我有以下。txt文件:
Marco
Paolo
Antonio
我想逐行读取它,对于每一行,我想为一个变量分配一个.txt行值。假设我的变量是$name,流是:
读取文件的第一行 分配$name = "Marco" 使用$name执行一些任务 从文件中读取第二行 指定$name = "Paolo"
当前回答
如果你需要同时处理输入文件和用户输入(或者来自stdin的任何东西),那么使用以下解决方案:
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
read -p "> $line (Press Enter to continue)"
done
基于已接受的答案和bash-hackers重定向教程。
在这里,我们打开作为脚本参数传递的文件的文件描述符3,并告诉read使用这个描述符作为输入(-u 3)。因此,我们将默认的输入描述符(0)附加到终端或其他输入源,能够读取用户输入。
其他回答
如果你需要同时处理输入文件和用户输入(或者来自stdin的任何东西),那么使用以下解决方案:
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
read -p "> $line (Press Enter to continue)"
done
基于已接受的答案和bash-hackers重定向教程。
在这里,我们打开作为脚本参数传递的文件的文件描述符3,并告诉read使用这个描述符作为输入(-u 3)。因此,我们将默认的输入描述符(0)附加到终端或其他输入源,能够读取用户输入。
Use:
filename=$1
IFS=$'\n'
for next in `cat $filename`; do
echo "$next read from $filename"
done
exit 0
如果你设置不同的IFS,你会得到奇怪的结果。
下面的语句逐行读取作为参数传递的文件:
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代替。)
使用bash中的IFS(内部字段分隔符)工具,定义用于将行分隔为令牌的字符,默认包括<tab> /<空格> /<newLine>
步骤1:加载文件数据并插入到列表中:
# declaring array list and index iterator
declare -a array=()
i=0
# reading file in row mode, insert each line into array
while IFS= read -r line; do
array[i]=$line
let "i++"
# reading from file path
done < "<yourFullFilePath>"
步骤2:现在迭代并打印输出:
for line in "${array[@]}"
do
echo "$line"
done
访问数组中的一个变量:
echo "${array[0]}"
#! /bin/bash
cat filename | while read LINE; do
echo $LINE
done