Shell脚本读取配置⽂件
Shell脚本读取配置⽂件
[Class]
ids=student1,student2,student3
files=profilefile
[student1]
name=LiLei
age=16
[student2]
name=HanMeiMei
age=15
[student3]
name=Lucy
age=15
如何取[student1]下⾯name的值呢?⽤下⾯这⾏代码:
awk -F '=''/\[student1\]/{a=1}a==1&&$1~/name/{print $2;exit}' myconfig.ini
这句指令涉及到的内容挺多的,查了半天才搞明⽩,详细解释⼀下:
1.
2. “-F” 是awk命令的⼀个选项,⽤来指定后⾯记录(⾏)的分隔符号,就是确定⽤什么作为分隔符号把记录分成⼀个⼀个的域,这⾥
后⾯跟的 ‘=’ 表⽰⽤等号来分隔。
3. 再往后单引号中间是awk命令,awk命令由模式和动作组成,模式是⼀组⽤来测试输⼊⾏是否需要执⾏动作的规则,动作是包含语句、
函数和表达式的执⾏过程,简单来说就是模式决定动作何时触发和触发事件,动作执⾏对输⼊⾏的处理。
4. / \ [student1 \ ]/ 这就是上⾯说的awk命令的模式,模式与动作之间⽤ / 来分开,表⽰匹配到这个模式的话执⾏后⾯的动作,这⾥要
匹配的是 [strudent1] ,因为⽅括号[ ] 在shell中有特殊的意义,使⽤转义符号\ 表⽰单纯的 [ ] 符号,所以这⾥就是[strudent1] 。
5. {a=1} 花括号⾥⾯的内容是awk命令的动作,这⾥就是给a赋值为1.
6. a==1&&$1~/name/ 这⾥⼜是⼀个模式匹配,先是判断a是否等于1(因为刚才已经给a赋值为1,所以这⾥肯定相等),还要
$1~/name/,$1表⽰第⼀域,就是字符串⽤分隔符号分割后的第⼀段, ~ 符号在awk命令中是关系运算符号,表⽰匹配正则表达式,这⾥就是要第⼀域为name
7. {print $2;exit} 这⾥⼜是⼀个动作,打印第⼆域,即第⼀域name的取值,然后退出awk命令。
8. myconfig.ini 当然表⽰对 myconfig.ini ⽂件的操作。
这句话整体的含义就是: 对 myconfig.ini ⽂件进⾏操作,⽤=对每⼀⾏进⾏分割,到匹配[student1]的section,再从
[student1] 下⾯到name这⼀opiton,最后打印option的取值。
有了这句话,现在就可以使⽤shell脚本对 myconfig.ini ⽂件进⾏操作了:
configOperate.sh
#!/bin/bash
getconfig()
{
Section=$1 #传递的第⼀个参数
ConFile=$2 #传递的第⼆个参数
Options="name\tage\t"
echo $Options|tr '\\t''\t'
for loop in $(echo $Options|tr '\\t'' ') #tr替换命令
do
#{gsub(/[[:blank:]]*/,"",$2)去除值两边的空格内容
awk -F '=''/\['"$Section"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t\t",$2) ;exit}' $ConFile
done
}
#更改变量名称
CONFIGFILE=$1
#⽂件名称
echo -e "ConfigName:$CONFIGFILE \n"
#取得ids中的每个id把,号分隔改成空格,因为循环内容要以空格分隔开来
profile=`sed -n '/ids/'p $CONFIGFILE | awk -F='{print $2}'| sed 's/,/ /g'`
#对于⼀个配置⽂件中的所有id循环
for stdudent in $profile
do
echo "--------------------------------------------------"
echo "student:$stdudent"
getconfig $stdudent $CONFIGFILE
echo -e "\n"
done
脚本的解释:
⾸先定义了getconfig()函数,⽤来将选定的section中的每个option以及取值打印出来。其中的$1、$2是调⽤函数时传递给它的第⼀个和第⼆个参数。
下⾯两句
Options="name\tage\t"
echo $Options|tr '\\t''\t'
这两句是为了打印两个option :name和age
tr '\\t''\t'
tr命令⽤于替换,这⾥是将 \t 这两个普通符号替换成了制表符号tab,注意\t的⽤法,因为\符号除了是⼀个普通符号之外还表⽰转义字符,所以⽤转义字符 \ 将它本⾝转化视作⼀个普通的符号。
这两句的结果是输出
name age
下⾯⼀句
for loop in $(echo $Options|tr '\\t'' ')
这句的意思就是循环中让loop分别取name和age
也可以这样写
for loop in name age
但是不能⽤
for loop in `echo $Options|tr '\\t'' '` # ` 执⾏符号
虽然在这句话中能实现的作⽤⼀样,但是放到整个脚本中却会有问题,不清楚为什么。
有了之前的解释,这⼀句
awk -F '=''/\['"$Section"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t\t",$2) ;exit}' $ConFile
就好理解了,不同之除就是如果⽤变量来代替student1…的话,格式是 ‘"$Section"’,先双引号,再单引号,gsub(/[[:blank:]]*/,"",$2) 去除值两边的空格内容,printf 是格式化输出。
以上是定义的getconfig函数。
下⾯需要解释的是
profile=`sed -n '/ids/'p $CONFIGFILE | awk -F='{print $2}'| sed 's/,/ /g'`
执⾏符号` 表⽰将⾥⾯命令运⾏的结果赋值给变量
sed -n '/ids/'p $CONFIGFILE
awk -F='{print $2}'
shell最简单脚本⽤=将这⼀⾏分割,打印第⼆部分,即 student1,student2,student3
sed 's/,/ /g'
将逗号替换为空格
下⾯的内容相对简单, 主要是函数的调⽤⽅法为
getconfig $stdudent $CONFIGFILE
最后的运⾏结果:
mk90@mk90-e420:~/Documents/myshell$ ./configOperate.sh myconfig.ini ConfigName:myconfig.ini
-
-------------------------------------------------
student:student1
name age
LiLei 16
--------------------------------------------------
student:student2
name age
HanMeiMei 15
--------------------------------------------------
student:student3
name age
Lucy 15
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论