shell学习之逐行读取文本

有如下配置文件setDaemon.cfg,希望读取其中内容,并赋值给shell脚本中的变量

daemonFileName=/home/work/local/liumengting/shellScripts/daemon.sh
daemonLogFileName=/home/work/local/liumengting/daemon.log.
protectedFileName=/home/work/local/liumengting/shellScripts/clearLog.sh

shell中提供三种读取文件的方法:

第一种:
cat $fileName | while read line
do
  [statements]
done

第二种:
for line in `cat $fileName`
do
  [statements]
done

第三种:
while read line
do
  [statements]
done < $fileName

按照第一种的方法,编写代码test.sh如下:
#!/bin/bash 
daemonFilename="test.sh"
fileName="/home/work/local/liumengting/setDaemon.cfg"
cat $fileName | while read line                 
do  
    parameterName=`echo $line | awk -F "=" '{print $1}'`
    parameterValue=`echo $line | awk -F "=" '{print $2}'`
    if [ "$parameterName"x = "daemonFileName"x ]
    then
        daemonFilename=$parameterValue
        echo $daemonFilename
        break
    fi 
done 
echo $daemonFilename


运行结果如下:
/home/work/local/liumengting/shellScripts/daemon.sh
test.sh

按照第二种方法,编写代码test.sh如下:
#!/bin/bash 
daemonFilename="test.sh"
fileName="/home/work/local/liumengting/setDaemon.cfg"
for line in `cat $fileName`
do      
    parameterName=`echo $line | awk -F "=" '{print $1}'`
    parameterValue=`echo $line | awk -F "=" '{print $2}'`
    if [ "$parameterName"x = "daemonFileName"x ]
    then
        daemonFilename=$parameterValue
        echo $daemonFilename
        break
    fi  
done    
echo $daemonFilename
运行结果如下:
/home/work/local/liumengting/shellScripts/daemon.sh
/home/work/local/liumengting/shellScripts/daemon.sh
按照第三种方法,编写代码test.sh如下:
#!/bin/bash 
daemonFilename="test.sh"
fileName="/home/work/local/liumengting/setDaemon.cfg"
while read line 
do
     parameterName=`echo $line | awk -F "=" '{print $1}'`
     parameterValue=`echo $line | awk -F "=" '{print $2}'`
     if [ "$parameterName"x = "daemonFileName"x ]
     then                     
         daemonFilename=$parameterValue
         echo $daemonFilename
         break
     fi 
done < $fileName
echo $daemonFilename
运行结果如下:
/home/work/local/liumengting/shellScripts/daemon.sh
/home/work/local/liumengting/shellScripts/daemon.sh
结论:
第一种方式,循环中的变量赋值是在管道中进行的,因此循环结束后变量赋值效果未成功影响到循环外的变量。故输出结果不是期望的结果。
第二种方式和第三种方式均可以达到理想效果。
但是需要注意第二种方式for循环的方式,在文件行中有空格的时候并不能达到逐行读取的效果。
如下所示文本:
testFor.cfg:
This is a test
Can you guess the output
使用第二种方式testFor.sh:
#!/bin/bash 
fileName="/home/work/local/liumengting/testFor.cfg"
for line in `cat $fileName`
do
    echo $line
done
运行结果如下:
This
is
a
test
Can
you
guess
the
output
使用第三种方式testWhile.sh
#!/bin/bash 
fileName="/home/work/local/liumengting/testFor.cfg"
while read line
do
    echo $line
done < $fileName
运行结果如下:
This is a test
Can you guess the output

你可能感兴趣的:(shell学习)