Shell指令碼讀取ini設定檔的實現代碼2例_linux shell

來源:互聯網
上載者:User

一、簡單版

參考stackoverflow的例子,改了一個出來:

複製代碼 代碼如下:

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

使用的時候:

複製代碼 代碼如下:

${section.key}

就可以讀到變數啦。

二、複雜版

複製代碼 代碼如下:

[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裡面的常量,因為$為Regex的特殊字元,雙引號,標示取變數的值
       #{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

 
兩個小時終於寫好了,請各位轉載的時候不要忘記加上我的地址哦,也不枉費我辛苦一場。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.