2011-05-12 19 views
12

Pythons ConfigParser veya Perl Config :: INI gibi bir şeye benzetilen kabuk komut dosyası arıyorum. Bunu başarmak için geçmişte kaynak dosyalarım var, ancak "config dosyasımı" yürütmektense okumayı tercih ederim. Kabuk (veya bash) komut dosyaları için mevcut olan yukarıdaki modüllerle karşılaştırılabilir bir şey bilen var mı?Bir kabuk dosyasından bir yapılandırma dosyası okuma

sayesinde Jerry

+1

olası bir kopyası [Bir kabuk betiğindeki INI değerini nasıl alabilirim?] (Http://stackoverflow.com/questions/6318809/how-do-i-grab-an-ini-value-within-a -shell-script) – kenorb

cevap

12

Kaynak istemiyoruz o yapmanız gerekir böylece:

yapılandırma 1.read, 2.verify hatları

CONFIGFILE="/path/to/config" 
echo "=$ADMIN= =$TODO= =$FILE=" #these variables are not defined here 
eval $(sed '/:/!d;/^ *#/d;s/:/ /;' < "$CONFIGFILE" | while read -r key val 
do 
    #verify here 
    #... 
    str="$key='$val'" 
    echo "$str" 
done) 
echo =$ADMIN= =$TODO= =$FILE= #here are defined 

örnek bunları 3.eval yapılandırma dosyasının

ADMIN: root 
TODO: delete 

var=badly_formtatted_line_without_colon 

#comment 
FILE: /path/to/file 

yukarıdaki örneği (test) almalısınız çalıştırırsanız:

== == == 
=root= =delete= =/path/to/file= 

bunun en iyi çözüm olmadığından emin olabilirsiniz - belki biri daha güzel bir mesaj gönderir.

+0

Sanırım ConfigParser gibi önceden paketlenmiş bir şey düşünüyordum, ama bu kesinlikle işe yarıyor. Teşekkürler! – zenzic

+0

Yapılandırma dosyasında boş satırları işlemek için: 'eval $ (sed '/^* #/d; s /://;' <" $ CONFIGFILE "| anahtar değerini oku [-n" $ {key } "]; daha sonra str =" $ key = '$ val "" echo "$ str" fi bitmiş) " – slonik

+0

@slonik Boş satırları işlemek için iyi bir nokta. Komut dosyasında, “sed” istenmeyen satırları filtreler, bu yüzden başka bir komutu baştan çıkarmak için yeterli olanı ekleyin: '/^* $/d' (ör. Yalnızca herhangi bir sayıda boşluk içeren satırları silme - ör. Sıfır veya daha fazla). Bana problemi işaret ettiğin için teşekkür ederim. Cevabımı düzenledim. – jm666

3
#!/bin/bash 
# Author: CJ 
# Date..: 01/03/2013 

## sample INI file save below to a file, replace "^I" with tab 
#^I [ SECTION ONE  ] 
#TOKEN_TWO^I ="Value1 two " 
#TOKEN_ONE=Value1 One 
#TOKEN_THREE=^I"Value1^I three" # a comment string 
#TOKEN_FOUR^I=^I"^IValue1 four" 
# 
#[SECTION_TWO] 
#TOKEN_ONE=Value1 One ^I^I^I# another comment string 
#TOKEN_TWO^I ="Value1 two " 
#TOKEN_THREE=^I"Value1^I three" 
#TOKEN_FOUR^I=^I"^IValue1 four" 
## sample INI file 

export INI= # allows access to the parsed INI values in toto by children 
iniParse() { 
    # Make word separator Linefeed(\n) 
    OIFS="${IFS}" 
    IFS=$(echo) 

    SECTION=_ 
    while read LINE; do { 
     IFS="${OIFS}" 

     # Skip blank lines 
     TMP="$(echo "${LINE}"|sed -e "s/^[ \t]*//")" 
     if [ 0 -ne ${#TMP} ]; then 
      # Ignore comment lines 
      if [ '#' == "${LINE:0:1}" -o '*' == "${LINE:0:1}" ]; then 
       continue 
      fi # if [ '#' == "${LINE:0:1}" -o '*' == "${LINE:0:1}" ]; then 

      # Section label 
      if [ "[" == "${LINE:0:1}" ]; then 
       LINE="${LINE/[/}" 
       LINE="${LINE/]/}" 
       LINE="${LINE/ /_}" 
       SECTION=$(echo "${LINE}")_ 
      else 
       LINE="$(echo "${LINE}"|sed -e "s/^[ \t]*//")" 
       LINE="$(echo "${LINE}"|cut -d# -f1)" 

       TOKEN="$(echo "${LINE:0}"|cut -d= -f1)" 
       EQOFS=${#TOKEN} 
       TOKEN="$(echo "${TOKEN}"|sed -e "s/[ \t]*//g")" 

       VALUE="${LINE:${EQOFS}}" 
       VALUE="$(echo "${VALUE}"|sed -e "s/^[ \t=]*//")" 
       VALUE="$(echo "${VALUE}"|sed -e "s/[ \t]*$//")" 

       if [ "${VALUE:0:1}" == '"' ]; then 
        echo -n "${SECTION}${TOKEN}=${VALUE}" 
        echo -e "\r" 
       else 
        echo -n "${SECTION}${TOKEN}="\"${VALUE}\""" 
        echo -e "\r" 
       fi # if [ "${VALUE:0:1}" == '"' ]; then 
      fi # if [ "[" == "${LINE:0:1}" ]; then 
     fi # if [ 0 -ne ${#TMP} ]; then 

     IFS=$(echo) 
    } done <<< "$1" 

    IFS="${OIFS}" # restore original IFS value 
} # iniParse() 

# call this function with the INI filespec 
iniReader() { 
    if [ -z "$1" ]; then return 1; fi 

    TMPINI="$(<$1)" 
    TMPINI="$(echo "${TMPINI}"|sed -e "s/\r//g")" 
    TMPINI="$(echo "${TMPINI}"|sed -e "s/[ \t]*\[[ \t]*/[/g")" 
    TMPINI="$(echo "${TMPINI}"|sed -e "s/[ \t]*\][ \t]*/]/g")" 

    INI=`iniParse "${TMPINI}"` 
    INI="$(echo "${INI}"|sed -e "s/\r/\n/g")" 
    eval "${INI}" 

    return 0 
} # iniReader() { 

# sample usage 
if iniReader $1 ; then 
    echo INI read, exit_code $? # exit_code == 0 
    cat <<< "${INI}" 
    cat <<< "${SECTION_ONE_TOKEN_FOUR}" 
    cat <<< "${SECTION_ONE_TOKEN_THREE}" 
    cat <<< "${SECTION_TWO_TOKEN_TWO}" 
    cat <<< "${SECTION_TWO_TOKEN_ONE}" 
else 
    echo usage: $0 filename.ini 
fi # if iniReader $1 ; then 
3

Sen sudo apt-get install cfget ile kurulabilir cfget bir göz atmak isteyebilirsiniz.

+0

Sisteminizde yükleme haklarına sahipseniz, bu gerçekten kullanışlı bir araçtır. –

İlgili konular