有如下配置文件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