逐行读取文件,将该值分配给variables
我有以下的.txt文件:
Marco Paolo Antonio
我想逐行阅读,并为每一行我想分配一个.txt行值的variables。 假设我的variables是$name
,stream程是:
- 从文件中读取第一行
- 分配
$name
=“Marco” - 用
$name
做一些任务 - 从文件中读取第二行
- 分配
$name
=“Paolo”
以下内容(另存为rr.sh
) rr.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