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

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

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

第一种 ——-重定向法;管道法

#!/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" = "daemonFileName" ]; then  
        daemonFilename=$parameterValue  
        echo $daemonFilename  
        break  
    fi   
done   
echo $daemonFilename  

输出结果:

/home/work/local/liumengting/shellScripts/clearLog.sh
test.sh

第二种 ——-for 循环

#!/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" = "$daemonFileName" ]  
    then  
        daemonFilename=$parameterValue  
        echo $daemonFilename  
        break  
    fi    
done      
echo $daemonFilename  

输出结果:

/home/work/local/liumengting/shellScripts/clearLog.sh
/home/work/local/liumengting/shellScripts/clearLog.sh

第三种 ——-while循环 (while循环中读写文件时,方式执行效率最高。)

#!/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" = "$daemonFileName" ]  
     then                       
         daemonFilename=$parameterValue  
         echo $daemonFilename  
         break  
     fi   
done < $fileName  
echo $daemonFilename  

输出结果:

/home/work/local/liumengting/shellScripts/clearLog.sh
/home/work/local/liumengting/shellScripts/clearLog.sh

Linux Bash中三个小于号 < < < 是什么意思

< < < 就是将后面的内容作为前面命令的标准输入

while read line;do
    grep "Holder" <<< $line
    [[ $? -eq 0 ]] && rm $line  #如果grep成功则删除文件
done <<EOF
`ls`
EOF

结论:

第一种方式,循环中的变量赋值是在管道中进行的,因此循环结束后变量赋值效果未成功影响到循环外的变量。故输出结果不是期望的结果。
第二种方式和第三种方式均可以达到理想效果。
但是需要注意第二种方式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