为了账号安全,请及时绑定邮箱和手机立即绑定

逐行读取文件,将值赋值给变量

逐行读取文件,将值赋值给变量

逐行读取文件,将值赋值给变量我有以下.txt文件:Marco Paolo Antonio我想逐行读取它,对于每一行,我都希望将一个.txt行值赋给一个变量。假设我的变量是$name,流量是:从文件中读取第一行指派$name=“马可”用$name从文件中读取第二行指派$name=“Paolo”
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

以下内容逐行读取作为参数传递的文件:

#!/bin/bashwhile IFS= read -r line; do
    echo "Text read from file: $line"done < "$1"

这是标准形式用于从循环中的文件中读取行。说明:

  • IFS=

    (或

    IFS=''

    )防止前导/尾随空格被裁剪。
  • -r

    防止反斜杠被解释。

如果将上述内容保存到具有文件名的脚本中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"

(非巴什壳可能不知道read -u3;使用read <&3)


查看完整回答
反对 回复 2019-06-06
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我鼓励你使用-rread代表:

-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/bashfilename="$1"while read -r line; do
    name="$line"
    echo "Name read from file - $name"done < "$filename"


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 1251 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信