shell命令之 IFS 分隔符;cat逐行读取文件

本文介绍了在Shell脚本中如何处理文件读取时遇到的空白符问题。当使用cat命令读取含有空白符的文件时,不会按行输出。解决方案包括使用while read循环读取和设置IFS内部字段分隔符为换行符。通过示例代码展示了这两种方法的实现,帮助理解IFS变量在处理行内分隔符时的作用。
摘要由CSDN通过智能技术生成

shell命令之 IFS 分隔符;cat逐行读取文件

情景

我们经常会使用 cat 命令读取文件,但当行内有空白符(空格、tab、换行)时就不会按行输出了
文件内容

a b
1 2
3 4

脚本内容

for i in `cat file`
do
   echo $i
done

结果内容

a
b
1
2
3
4

解决方案

方案1 while read的应用

格式1

while read line
do
   echo $line
done < file

格式2

cat file | while read line
do
   echo $line
done

read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理

方案2 设置分割符

IFS=$'\n' # 定义分割符
# for i in $(cat file)    # better
# for i in $(<file)       # in bash
for i in `cat file`
do 
    echo "$i"
done

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

IFS=$'\n' # 这才是真正的换行符。

解释

Shell 脚本中有个变量叫IFS(Internal Field Seprator)内部域分隔符
Shell 的环境变量分为set, env两种,其中 set 变量可以通过 export 工具导入到 env 变量中。
其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。

IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量.
IFS 详细内容可参考:https://www.cnblogs.com/weq0805/p/15027357.html

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值