逐行读取文件,将该值分配给variables

我有以下的.txt文件:

Marco Paolo Antonio 

我想逐行阅读,并为每一行我想分配一个.txt行值的variables。 假设我的variables是$name ,stream程是:

  • 从文件中读取第一行
  • 分配$name =“Marco”
  • $name做一些任务
  • 从文件中读取第二行
  • 分配$name =“Paolo”

以下内容(另存为rr.shrr.sh读取作为parameter passing的文件:

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

说明:

  • IFS='' (或IFS= )可防止前导/尾随空白被修剪。
  • -r防止解释反斜杠转义。
  • || [[ -n $line ]] || [[ -n $line ]]防止最后一行被忽略,如果它不以\n结尾(因为read遇到EOF时返回一个非零的退出代码)。

按如下所示运行脚本:

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

….

我鼓励你使用-r标志来read ,代表:

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

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

 while read name do # Do what you want to $name done < filename 
 #! /bin/bash cat filename | while read LINE do echo $LINE done 

使用:

 filename=$1 IFS=$'\n' for next in `cat $filename` do echo "$next read from $filename" done exit 0 

如果你设置了不同的IFS你会得到奇怪的结果。

许多人已经发布了一个过度优化的解决scheme。 我不认为这是不正确的,但我谦虚地认为,一个较不优化的解决scheme将是可取的,让大家容易理解这是如何工作的。 这是我的build议:

 #!/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" 

如果您需要同时处理input文件和用户input(或者其他标准input),请使用以下解决scheme:

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

根据接受的答案和bash-hackerredirect教程 。

在这里,我们打开文件描述符3作为脚本parameter passing的文件,并告诉read使用这个描述符作为input( -u 3 )。 因此,我们将默认input描述符(0)附加到terminal或另一个input源,以便读取用户input。

我读到的问题是:

“如果我想用一个预期的方式读取一个文件,应该怎么做?我想这样做,因为当我写'用$ name执行一些任务'时,我的意思是我的任务是期待命令。

从内部读取文件:

yourExpectScript:

 #!/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 

然后像这样调用它:

 yourExpectScript file_with_names.txt