Linux 文件的行遍历

#!/bin/bash

# 字符串拼接专题

name="Shell"
url="http://c.biancheng.net/shell/"

str1=$name$url  #中间不能有空格
str2="$name $url"  #如果被双引号包围,那么中间可以有空格
str3=$name": "$url  #中间可以出现别的字符串
str4="$name: $url"  #这样写也可以
str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号

echo "==========方式一========="

context='start\n'
# 文件读取方式一
cat '1.c' | while read line
do
    echo ${line}
    context="${context}${line}"
done

# 无法打印出文件中的任何内容
:<<!
使用的是管道符号,这使得while语句在子shell中执行,这意味着while语句内部设置的变量、数组、函数等在循环外部都不再生效。
例如:echo haha | a=5,在命令执行结束后,变量a的值也不再是5。
!

echo $context

echo "==========方式二========="

# 文件读取方式二

while read line
do
    echo ${line}
    context="${context}${line}"'\n'
done < '1.c'

#成功给context赋值
echo -e $context

 

特别说明:

如果被读的文件最后一行之后没有换行符\n,则read读取最后一行时遇到文件结束符EOF,循环即终止。

虽然,此时$line内存有最后一行,但程序已经没有机会再处理此行内容

解决方案

while read line || [[ -n ${line} ]]

这样当文件没有到最后一行时不会测试-n $line,当遇到文件结束(最后一行)时,仍然可以通过测试$line是否有内容来进行继续处理。

posted on 2020-07-03 20:41  寒魔影  阅读(1253)  评论(0编辑  收藏  举报

导航