linux shell中for循环,如何读取整一行

在处理一个多行数据的过程中,使用for循环去读取每行数据,结果发现输出是

[Sam@localhost 20220927-temp]$ more temp.list
aaa     bbb     ccc
ddd     eee     fff
ggg     hhh     iii
[Sam@localhost 20220927-BA]$ for i in `cat temp.list`;do echo $i;done
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii

shell中for循环的默认分隔符是:空格、tab、\n

一、若shell for 循环以\n作为分隔符,输出整行

方式一:

#! /bin/bash

IFS=$'\n'
for i in `cat emp.list`
do 
  echo $i
done

运行时使用./aa.sh 或者bash aa.sh。 不能使用sh aa.sh。

IFS="\n" # 将字符n作为IFS的换行符。
IFS=$"\n" # 这里\n确实通过$转化为了换行符,但仅当被解释时(或被执行时)才被转化为换行符;第一个和第二个是等价的
IFS=$'\n' # 这才是真正的换行符。

方式二:

#! /bin/bash
while read i
do 
  echo $i
done <temp.list

或者
#! /bin/bash
cat temp.list |while read i
do 
  echo $i
done

$ bash aa.sh
aaa bbb ccc
ddd eee fff
ggg hhh iii

二、若shell循环,读取每行第二列,列之间以tab分隔

方法一:

开始时使用read 定义tab键的方式不成功


$ while read i; do a=`echo $i|cut -f2 -d '       '`; echo $a;done <temp.list
aaa bbb ccc
ddd eee fff
ggg hhh iii
$ while read i; do a=`echo $i|cut -f2 -d$'\t'`; echo $a;done <temp.list
aaa bbb ccc
ddd eee fff
ggg hhh iii

转换为"$i" 则可成功,是因为echo $i会将默认tab或者空格作为分隔符的默认输出为空格,若管道后的命令的分隔符为\t,则不会按要求分割。
同一个坑掉多次!

$ while read i; do a=`echo "$i"|cut -f2 -d '       '`; echo $a;done <temp.list
bbb
eee
hhh

$ while read i; do a=`echo "$i"|cut -f2 -d $'\t'`; echo $a;done <temp.list
bbb
eee
hhh

cut 的tab分隔符有两种方式:(1)先ctrl+v,然后按tab键,记得用单引号引起来;(2)使用$'\t'。

方法二:

可以使用将行存入数组的方式调取数组的第二个元素,但要确保每列使用同样的分隔符,若既有空格又有tab键分隔符,则会出现混乱
$ while read line;do a=($line); echo ${a[1]};done <temp.list
bbb
eee
hhh

或者
while read line; do a=${line#*   };b=${a%%       *};echo $a,$b;done <temp1.list
bbb ccc,bbb
eee fff,eee
hhh iii,hhh
hanna2 hanna3,hanna2
#前两列为a变量,后一列为b变量。此处是按照tab键分隔。

##################################################################################################
补充1:IFS知识\
环境变量IFS,成为内部字段分隔符(internal field seperator),定义了bash shell 用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符

  • 空格
  • 制表符 tab键
  • 换行符 \n

~~~~可使用以下命令查看当前默认的IFS

$ echo "$IFS" | od -b  
0000000 040 011 012 012  
0000004

或者
$ set |grep IFS
IFS=$' \t\n'

~~~~直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符"\n" 。最后一个 012 是因为 echo 默认是会换行的。

~~~~若单行数据中有空格时,使用for循环读取每一行,由于空格为默认的字段分隔符,bash shell 遇到空格,就认为读取到一个新的字段,会出现问题。此时需要在shell脚本中临时改变环境变量IFS的值来限制被bash shell当作字符段的字符,如修改为IFS=$'\n'IFS=$'\t'

但是修改完IFS后,如何恢复IFS默认值?
答: 方法一:简单粗暴,直接关闭当前终端。(经测试若修改只影响当前终端窗口)
方法二:可以在修改IFS之前保存原来的IFS值,之后在恢复它,以防忘记,后续出现奇奇怪怪的显示。如下所示:

IFS_old=$IFS
IFS=$'\n'
#在接下来的代码中使用新的IFS
#code
#使用完毕后恢复IFS原来的值
IFS=$IFS_old

答:方式三:在终端输入IFS=$' \t\n',即将是恢复为空格、tab键、和换行符作为分隔符。

##################################################################################################

补充2:while\ read\ line 与for循环的区别、

while read line是一次性将一行的文件信息读入并赋值给变量line。当文件中有多行文字,在while循环中再一次调用read语句,就会读取到下一条记录。而$line中的最后一行读完,无法获取下一行记录,从而退出while循环。

for是每次读取文件中一个以空格为分隔符的字符串。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容