Shell腳本讀取ini配置文件的實(shí)現(xiàn)代碼2例
一、簡(jiǎn)單版
參考stackoverflow的例子,改了一個(gè)出來:
while IFS='= ' read var val
do
if [[ $var == \[*] ]]
then
section=$(echo $var | sed 's/^\[\(.*\)\]$/\1/')
elif [[ $val ]]
then
if [ -z $section ];then
declare "${var}=$val"
else
declare "${section}.${var}=$val"
fi
fi
done < config.ini
使用的時(shí)候:
${section.key}
就可以讀到變量啦。
二、復(fù)雜版
[comon]
ids=com1,com2,com3
files=profilefile
[com1]
key="name"
file="test"
[com2]
key="name1"
file="test"
[com3]
key="name2"
file="test"
取[com1]的key值我查了下,還好在ChinaUnix里面查到了命令(貌似一位叫wintty兄寫的):
這樣就簡(jiǎn)單取到值了。
查了下命令終于明白,命令分為兩個(gè)部分:
先模式匹配到:[com1]然后執(zhí)行動(dòng)作:a=1,再接著有來個(gè)模式+命令
模式:“a==1&&$1~/key/”
a==1因?yàn)橐呀?jīng)賦值了,所以執(zhí)行下一步,如果$1第一個(gè)字段匹配key的值,則
打印第2項(xiàng),緊接著退出,退出就不會(huì)打印到匹配[com2]和[com3]的key值.
需求會(huì)變得,現(xiàn)在變成取【com】幾個(gè)key對(duì)應(yīng)的值,提供的shell的腳本如下:
#!/bin/sh
getconfig()
{
SECTION=$1
CONFILE=$2
ENDPRINT="key\tfile\t"
echo "$ENDPRINT"
for loop in `echo $ENDPRINT|tr '\t' ' '`
do
#這里面的的SECTION的變量需要先用雙引號(hào),再用單引號(hào),我想可以這樣理解,
#單引號(hào)標(biāo)示是awk里面的常量,因?yàn)?為正則表達(dá)式的特殊字符,雙引號(hào),標(biāo)示取變量的值
#{gsub(/[[:blank:]]*/,"",$2)去除值兩邊的空格內(nèi)容
awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE
done
}
#更改變量名稱
CONFIGFILE=$1
echo "========================================================"
#文件名稱
echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
#取得ids中的每個(gè)id把,號(hào)分隔改成空格,因?yàn)檠h(huán)內(nèi)容要以空格分隔開來
profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
#對(duì)于一個(gè)配置文件中的所有id循環(huán)
for OneCom in $profile
do
echo "--------------------------------------------------"
echo "COM:$OneCom"
#此處函數(shù)調(diào)用有時(shí)候不能用反引號(hào),不然會(huì)出錯(cuò),此處原由還不清楚知道的麻煩請(qǐng)告之
getconfig $OneCom $CONFIGFILE
echo "\n"
echo "--------------------------------------------------"
#break
done
echo "========================================================"
執(zhí)行的結(jié)果如下:
========================================================
+++ConfigName:File+++++++++++++++++++++++++++++++
--------------------------------------------------
COM:com1
key file
name file1
--------------------------------------------------
--------------------------------------------------
COM:com2
key file
name1 file2
--------------------------------------------------
--------------------------------------------------
COM:com3
key file
name2 file3
--------------------------------------------------
嘿嘿需求又變了,配置文件有多個(gè),怎么取多個(gè)文件的配置項(xiàng)嘛:
getconfig()
{
SECTION=$1
CONFILE=$2
ENDPRINT="key\tfile\t"
echo "$ENDPRINT"
for loop in `echo $ENDPRINT|tr '\t' ' '`
do
awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE
done
}
#顯示的多個(gè)文件名將多行的回車符轉(zhuǎn)成逗號(hào)分隔符
CONFIGFILES=`ls $1|tr '\n' ','`
#查看到底有多個(gè)配置文件
_Num=`echo $CONFIGFILES|tr -cd \,|wc -c`
#臨時(shí)變量保存配置多個(gè)文件
_TMPFILES=$CONFIGFILES
while [ $_Num -ge 1 ]
do
#得到一個(gè)文件
CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1`
#余下的文件
_TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-`
#配置文件數(shù)量減一
_Num=$(($_Num-1))
echo "========================================================"
#文件名稱
echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
#對(duì)于一個(gè)配置文件中的所有id循環(huán)
for OneCom in $profile
do
echo "--------------------------------------------------"
echo "COM:$OneCom"
getconfig $OneCom $CONFIGFILE
echo "\n"
echo "--------------------------------------------------"
#break
done
echo "========================================================"
done
兩個(gè)小時(shí)終于寫好了,請(qǐng)各位轉(zhuǎn)載的時(shí)候不要忘記加上我的地址哦,也不枉費(fèi)我辛苦一場(chǎng)。
相關(guān)文章
shell基礎(chǔ)學(xué)習(xí)中的字符串操作、for循環(huán)語句示例
這篇文章主要介紹了shell基礎(chǔ)學(xué)習(xí)中的字符串操作、for循環(huán)語句示例2014-04-04mac使用Shell(終端)SSH連接遠(yuǎn)程服務(wù)器的方法
這篇文章主要介紹了mac使用Shell(終端)SSH連接遠(yuǎn)程服務(wù)器的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Linux全網(wǎng)最全面常用命令整理(附實(shí)例)
這篇文章主要介紹了Linux命令,是目前最全面的集合,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08開發(fā)者常用及實(shí)用Linux Shell命令備忘錄(小結(jié))
這篇文章主要介紹了開發(fā)者常用及實(shí)用Linux Shell命令備忘錄(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11一天一個(gè)shell命令 文本操作系列-linux dd使用教程
dd 是 Linux/UNIX 下的一個(gè)非常有用的命令,作用是用指定大小的塊拷貝一個(gè)文件,并在拷貝的同時(shí)進(jìn)行指定的轉(zhuǎn)換2016-05-05分享70個(gè)經(jīng)典的 Shell 腳本面試題與答案
我們?yōu)槟愕拿嬖嚋?zhǔn)備選擇了 70 個(gè)你可能遇到的 shell 腳本面試問題及解答。了解腳本或至少知道基礎(chǔ)知識(shí)對(duì)系統(tǒng)管理員來說至關(guān)重要,它也有助于你在工作環(huán)境中自動(dòng)完成很多任務(wù)2018-02-02