关于bash:逐行读取文件,将值赋给变量

Read a file line by line assigning the value to a variable

在.txt有以下文件:

1
2
3
Marco
Paolo
Antonio

我想读它的线-线,和为每个线我想assign A .txt线两个变量的值。我supposing变$name冰,冰流

  • 从文件读取第一行
  • assign $name="马可"
  • $name做一些任务。
  • 二次线从文件读
  • assign $name="保罗"


以下(另存为rr.sh)逐行读取作为参数传递的文件:

1
2
3
4
#!/bin/bash
while IFS='' read -r line || [[ -n"$line" ]]; do
    echo"Text read from file: $line"
done <"$1"

说明:

  • IFS=''IFS=防止前导/尾随空格被修剪。
  • -r防止反斜杠溢出被解释。
  • 如果最后一行没有以
    结尾,则|| [[ -n $line ]]可防止忽略它(因为read在遇到eof时返回非零退出代码)。

按如下方式运行脚本:

1
2
chmod +x rr.sh
./rr.sh filename.txt


我鼓励您使用-r标志表示read代表:

1
2
-r  Do not treat a backslash character in any special way. Consider each
    backslash to be part of the input line.

我是从江户记下的。

另一件事是以文件名作为参数。

以下是更新的代码:

1
2
3
4
5
6
#!/usr/bin/bash
filename="$1"
while read -r line; do
    name="$line"
    echo"Name read from file - $name"
done <"$filename"


使用下面的bash模板应该允许您一次从一个文件中读取一个值并对其进行处理。

1
2
3
while read name; do
    # Do what you want to $name
done < filename


1
2
3
4
#! /bin/bash
cat filename | while read LINE; do
    echo $LINE
done


许多人发布了一个过度优化的解决方案。我不认为这是错误的,但我谦虚地认为,一个不太优化的解决方案将是可取的,使每个人都能轻松理解这是如何工作的。这是我的建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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"

用途:

1
2
3
4
5
6
7
filename=$1
IFS=$'
'

for next in `cat $filename`; do
    echo"$next read from $filename"
done
exit 0

如果将IFS设置为不同的值,则会得到奇怪的结果。


如果您需要同时处理输入文件和用户输入(或来自stdin的任何其他内容),请使用以下解决方案:

1
2
3
4
5
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n"$line" ]]; do
    read -p"> $line (Press Enter to continue)"
done

基于接受的答案和bash hacker重定向教程。

这里,我们打开作为脚本参数传递的文件的文件描述符3,并告诉read使用这个描述符作为输入(-u 3)。因此,我们将默认的输入描述符(0)附加到终端或其他输入源上,从而能够读取用户输入。


要正确处理错误:

1
2
3
4
5
6
7
8
9
#!/bin/bash

set -Ee    
trap"echo error" EXIT    
test -e ${FILENAME} || exit
while read -r line
do
    echo ${line}
done < ${FILENAME}


下面将打印出文件的内容:

1
2
3
4
5
6
cat $Path/FileName.txt

while read line;
do
echo $line    
done

我把这个问题理解为:

"如果我想用Expect读取文件,我该怎么做?我想这样做是因为当我写"用$name做一些任务"时,我的意思是我的任务是expect命令。"

从Expect本身内部读取文件:

您的预期脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/expect
# Pass in filename from command line

set filename [ lindex $argv 0 ]

# Assumption: file in the same directory

set inFile [ open $filename r ]

while { ! [ eof $inFile ] } {

    set line [ gets $inFile ]

    # You could set name directly.

    set name $line

    # Do other expect stuff with $name ...

    puts" Name: $name"
}

close $inFile

然后像这样称呼它:

1
yourExpectScript file_with_names.txt