shell指令碼讀取ini配置檔案的值
阿新 • • 發佈:2019-02-07
[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兄寫的): awk -F '=' '/\[com1\]/{a=1}a==1&&$1~/key/{print $2;exit}' config.ini 這樣就簡單取到值了。 查了下命令終於明白,命令分為兩個部分: 先模式匹配到:[com1]然後執行動作:a=1,再接著有來個模式+命令 模式:“a==1&&$1~/key/” a==1因為已經賦值了,所以執行下一步,如果$1第一個欄位匹配key的值,則 列印第2項,緊接著退出,退出就不會列印到匹配[com2]和[com3]的key值. ------------------------------------------------------------- 需求會變得,現在變成取【com】幾個key對應的值,提供的shell的指令碼如下: #!/bin/sh getconfig() { SECTION=$1 CONFILE=$2 ENDPRINT="key\tfile\t" echo "$ENDPRINT" for loop in `echo $ENDPRINT|tr '\t' ' '` do #這裡面的的SECTION的變數需要先用雙引號,再用單引號,我想可以這樣理解, #單引號標示是awk裡面的常量,因為$為正則表示式的特殊字元,雙引號,標示取變數的值 #{gsub(/[[:blank:]]*/,"",$2)去除值兩邊的空格內容 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中的每個id把,號分隔改成空格,因為迴圈內容要以空格分隔開來 profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'` #對於一個配置檔案中的所有id迴圈 for OneCom in $profile do echo "--------------------------------------------------" echo "COM:$OneCom" #此處函式呼叫有時候不能用反引號,不然會出錯,此處原由還不清楚知道的麻煩請告之 getconfig $OneCom $CONFIGFILE echo "\n" echo "--------------------------------------------------" #break done echo "========================================================" 執行的結果如下: $ one.sh File ======================================================== +++ConfigName:File+++++++++++++++++++++++++++++++ -------------------------------------------------- COM:com1 key file name file1 -------------------------------------------------- -------------------------------------------------- COM:com2 key file name1 file2 -------------------------------------------------- -------------------------------------------------- COM:com3 key file name2 file3 -------------------------------------------------- ======================================================== 嘿嘿需求又變了,配置檔案有多個,怎麼取多個檔案的配置項嘛: #!/bin/sh 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 } #顯示的多個檔名將多行的回車符轉成逗號分隔符 CONFIGFILES=`ls $1|tr '\n' ','` #檢視到底有多個配置檔案 _Num=`echo $CONFIGFILES|tr -cd \,|wc -c` #臨時變數儲存配置多個檔案 _TMPFILES=$CONFIGFILES while [ $_Num -ge 1 ] do #得到一個檔案 CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1` #餘下的檔案 _TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-` #配置檔案數量減一 _Num=$(($_Num-1)) echo "========================================================" #檔名稱 echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++" profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'` #對於一個配置檔案中的所有id迴圈 for OneCom in $profile do echo "--------------------------------------------------" echo "COM:$OneCom" getconfig $OneCom $CONFIGFILE echo "\n" echo "--------------------------------------------------" #break done echo "========================================================" done 兩個小時終於寫好了,請各位轉載的時候不要忘記加上我的地址哦,也不枉費我辛苦一場。 http://www.cublog.cn/u1/55091/showart_2125956.html