Bash 逐行读取文件,将值分配给变量
我有以下.txt文件:Bash 逐行读取文件,将值分配给变量,bash,Bash,我有以下.txt文件: Marco 保罗 安东尼奥 我想逐行读取它,并为每一行分配一个.txt行值给一个变量。假设我的变量是$name,则流是: 从文件中读取第一行 分配$name=“马可” 使用$name 从文件中读取第二行 分配$name=“Paolo” 以下命令逐行读取作为参数传递的文件: while IFS= read -r line; do echo "Text read from file: $line" done < my_filename.txt 如果将上述内
Marco
保罗
安东尼奥
我想逐行读取它,并为每一行分配一个.txt行值给一个变量。假设我的变量是$name
,则流是:
- 从文件中读取第一行
- 分配
=“马可”$name
- 使用
$name
- 从文件中读取第二行
- 分配
=“Paolo”$name
- 以下命令逐行读取作为参数传递的文件:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
如果将上述内容保存到文件名为readfile
的脚本中,则可以按如下方式运行:
chmod +x readfile
./readfile filename.txt
如果文件不是(=未以换行符终止),则可以修改循环以处理尾随的部分行:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
(非Bash shell可能不知道
read-u3
;使用read使用以下Bash模板应该允许您一次从文件中读取一个值并对其进行处理
while read name; do
# Do what you want to $name
done < filename
读取名称时;执行以下操作
#做你想做的事$name
完成<文件名
我建议您使用-r
标志来表示读取
,它代表:
-r Do not treat a backslash character in any special way. Consider each
backslash to be part of the input line.
我引用的是man1read
另一件事是将文件名作为参数
更新代码如下:
#!/usr/bin/bash
filename="$1"
while read -r line; do
name="$line"
echo "Name read from file - $name"
done < "$filename"
!/usr/bin/bash
filename=“$1”
当读取-r行时;执行
name=“$line”
echo“从文件读取的名称-$Name”
完成<“$filename”
使用:
如果您以不同的方式设置了IFS
,您将得到奇怪的结果。如果您需要处理输入文件和用户输入(或stdin中的任何其他内容),请使用以下解决方案:
#! /bin/bash
cat filename | while read LINE; do
echo $LINE
done
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
read -p "> $line (Press Enter to continue)"
done
!/bin/bash
exec 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"
!/bin/bash
#
#这个程序从文件中读取行。
#
_文件的_结尾=0
而[[$end\u of_file==0]];执行
read-r行
#最后一个退出状态是
#文件结尾的标志
_文件的_结尾=$?
回音$线
完成<“$1”
正确处理错误:
#!/bin/bash
set -Ee
trap "echo error" EXIT
test -e ${FILENAME} || exit
while read -r line
do
echo ${line}
done < ${FILENAME}
!/bin/bash
set-Ee
陷阱“回声错误”退出
测试-e${FILENAME}| |退出
而read-r行
做
echo${line}
完成<${FILENAME}
以下内容将打印出文件的内容:
cat $Path/FileName.txt
while read line;
do
echo $line
done
在bash中使用IFS(内部字段分隔符)工具,定义用于将行分隔为标记的字符,默认情况下包括//
步骤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>"
数组中回声特定索引:访问数组中的变量:
echo "${array[0]}"
此方法有一个警告。如果while循环中的任何内容是交互式的(例如,从stdin读取),则它将从$1获取其输入。您将没有机会手动输入数据。值得注意的是,某些命令会中断(例如,它们会中断循环)这。例如,没有-n
标志的ssh
将有效地使您跳出循环。这可能是一个很好的原因,但我花了一段时间才确定是什么导致我的代码失败,然后才发现这一点。作为一行代码:IFS=''read-r line | |[[-n“$line”]];do echo“$line”;完成filename@OndraŽižka,这是由于ffmpeg
使用stdin造成的。添加抱怨:建议使用.sh
扩展。UNIX上的可执行文件通常根本没有扩展(您不运行ls.elf
),并且有一个bash shebang(以及仅使用bash的工具,如[[]]
)一个表示POSIX sh兼容的扩展名在内部是矛盾的。除非您想在意识到它之前出现全局绑定问题,否则请不要使用它!这并不可怕,执行过程中没有中断。@MUYBelgium您是否尝试过在一行中包含单个*
的文件?无论如何,这是一个反脚本tern.@OndraŽižka,read
方法是。您在评论中提到的警告适用于循环运行命令(例如ffmpeg
)从stdin读取的错误,通过使用非stdin FD进行循环或重定向此类命令的输入来解决。相比之下,解决for
-循环方法中的全局错误意味着进行(然后需要反转)shell全局设置更改。@OndraŽižka,……此外,您在这里使用的for
循环方法意味着在循环开始执行之前,必须读入所有内容,这使得即使禁用了全局绑定,如果在千兆字节的数据上循环,while read
循环也不需要存储任何内容每次超过一行的数据,这意味着它可以在生成内容的子流程仍在运行时开始执行(因此可用于流式传输目的),并具有有限的内存消耗。从line@Thomas中间的空间会发生什么?提示:不想要的命令执行。这对我来说是有效的,与公认的答案相反。@ TranslucentCloud,如果它工作了,并且接受的回答没有,我怀疑你的shell是代码> SH < /COD。e> ,而不是bash
;在中使用的扩展测试命令
公认答案中的语法是一种bashism。也就是说,这种语法实际上具有相关的含义:它会导致循环继续进行到输入文件的最后一行,即使它没有换行符。如果您想以符合POSIX的方式来做这件事,您应该使用|【-n“$line”]
,而不是[[
。也就是说,这仍然需要修改,以便为读取设置IFS=
,以防止删除空白。作为一行:whilereadname;do echo${name};donecat $Path/FileName.txt
while read line;
do
echo $line
done
# 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>"
for line in "${array[@]}"
do
echo "$line"
done
echo "${array[0]}"