我有以下。txt文件:
Marco
Paolo
Antonio
我想逐行读取它,对于每一行,我想为一个变量分配一个.txt行值。假设我的变量是$name,流是:
读取文件的第一行 分配$name = "Marco" 使用$name执行一些任务 从文件中读取第二行 指定$name = "Paolo"
我有以下。txt文件:
Marco
Paolo
Antonio
我想逐行读取它,对于每一行,我想为一个变量分配一个.txt行值。假设我的变量是$name,流是:
读取文件的第一行 分配$name = "Marco" 使用$name执行一些任务 从文件中读取第二行 指定$name = "Paolo"
当前回答
我鼓励你使用-r标志的read,它代表:
-r Do not treat a backslash character in any special way. Consider each
backslash to be part of the input line.
我引用了第一篇文章。
另一件事是将文件名作为参数。
以下是更新后的代码:
#!/usr/bin/bash
filename="$1"
while read -r line; do
name="$line"
echo "Name read from file - $name"
done < "$filename"
其他回答
#! /bin/bash
cat filename | while read LINE; do
echo $LINE
done
许多人发布了一个过度优化的解决方案。我不认为这是不正确的,但我谦虚地认为,一个不那么优化的解决方案将是可取的,以使每个人都能轻松地理解这是如何工作的。以下是我的建议:
#!/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,你会得到奇怪的结果。
如果你需要同时处理输入文件和用户输入(或者来自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)附加到终端或其他输入源,能够读取用户输入。
我鼓励你使用-r标志的read,它代表:
-r Do not treat a backslash character in any special way. Consider each
backslash to be part of the input line.
我引用了第一篇文章。
另一件事是将文件名作为参数。
以下是更新后的代码:
#!/usr/bin/bash
filename="$1"
while read -r line; do
name="$line"
echo "Name read from file - $name"
done < "$filename"