web-dev-qa-db-de.com

Analysieren von Variablen aus der Konfigurationsdatei in Bash

Den folgenden Inhalt in einer Datei haben:

VARIABLE1="Value1"
VARIABLE2="Value2"
VARIABLE3="Value3"

Ich brauche ein Skript, das folgendes ausgibt:

Content of VARIABLE1 is Value1
Content of VARIABLE2 is Value2
Content of VARIABLE3 is Value3

Irgendwelche Ideen?

15
KillDash9

awk -F\= '{gsub(/"/,"",$2);print "Content of " $1 " is " $2}' <filename>

Nur zu Ihrer Information, eine weitere reine Bash-Lösung

IFS="="
while read -r name value
do
echo "Content of $name is ${value//\"/}"
done < filename
28
abasu

Da es sich bei Ihrer Konfigurationsdatei um ein gültiges Shell-Skript handelt, können Sie es in Ihre aktuelle Shell einbetten:

. config_file
echo "Content of VARIABLE1 is $VARIABLE1"
echo "Content of VARIABLE2 is $VARIABLE2"
echo "Content of VARIABLE3 is $VARIABLE3"

Etwas trockener, aber kniffliger

. config_file
for var in VARIABLE1 VARIABLE2 VARIABLE3; do
    echo "Content of $var is ${!var}"
done
52
glenn jackman

Wenn Sie diese brauchen ...

Eigenschaften

  • Einzeilige und Inline-Kommentare; 
  • Leerzeichen um = zuschneiden (dh var = value schlägt nicht fehl);
  • Anführungszeichenwerte
  • Verständnis der DOS-Zeilenenden;
  • Bewahren Sie die Sicherheit auf und vermeiden Sie, Ihre Konfigurationsdatei zu beschaffen.

Code

shopt -s extglob
configfile="dos_or_unix" # set the actual path name of your (DOS or Unix) config file
tr -d '\r' < $configfile > $configfile.unix
while IFS='= ' read -r lhs rhs
do
    if [[ ! $lhs =~ ^\ *# && -n $lhs ]]; then
        rhs="${rhs%%\#*}"    # Del in line right comments
        rhs="${rhs%%*( )}"   # Del trailing spaces
        rhs="${rhs%\"*}"     # Del opening string quotes 
        rhs="${rhs#\"*}"     # Del closing string quotes 
        declare $lhs="$rhs"
    fi
done < $configfile.unix

Bemerkungen

tr -d '\r' ... löscht den DOS-Wagenrücklauf.
! $lhs =~ ^\ *# überspringt einzeilige Kommentare und -n $lhs leere Zeilen.
Um nachfolgende Leerzeichen mit ${rhs%%*( )} zu löschen, müssen Sie das erweiterte Globbing mit shopt -s extglob setzen. (Abgesehen von sed) können Sie dies über das komplexere vermeiden: 

rhs="${rhs%"${rhs##*[^ ]}"}"  

Testen Sie die Konfigurationsdatei

## This is a comment 
var1=value1             # Right side comment 
var2 = value2           # Assignment with spaces 

## You can use blank lines 
var3= Unquoted String   # Outer spaces trimmed
var4= "My name is "     # Quote to avoid trimming 
var5= "\"Bob\""         

Testcode

echo "Content of var1 is $var1"
echo "Content of var2 is $var2"
echo "Content of var3 is [$var3]"
echo "Content of var4 + var5 is: [$var4$var5]"

Ergebnisse

Content of var1 is value1
Content of var2 is value2
Content of var3 is [Unquoted String]
Content of var4 + var5 is: [My name is "Bob"]
31
antonio

Ich mache das auf diese Weise

. $PATH_TO_FILE
7
albert
awk '{print "Content of "$1" is "$3}' FS='[="]'

Ergebnis

 Inhalt von VARIABLE1 ist Wert1 
 Inhalt von VARIABLE2 ist Wert2 
 Inhalt von VARIABLE3 ist Wert3 
2
Steven Penny

eine Konfigurationsdatei wie folgt gegeben: -

[a]
b=C
d=E;rm t1
[b]
g=h

der folgende Einzeiler analysiert und hält die Werte: -

CFG=path-to-file; for ini in `awk '/^\[/' $CFG`;do unset ARHG;declare -A ARHG;while read A B;do ARHG[$A]=$B;echo "in section $ini, $A is equal to"  ${ARHG["$A"]};done < <(awk -F'=' '/\[/ {x=0} x==1 && $0~/=/ && NF==2 {print $1, $2} $0==INI {x=1}' INI="$ini" $CFG);declare -p ARHG;echo;done;printf "end loop\n\n";declare -p ARHG

Lassen Sie uns das jetzt brechen

CFG=path-to-file;
for ini in `awk '/^\[/' $CFG` # finds the SECTIONS (aka "ini")
do 
  unset ARHG # resets ARHG 
  declare -A ARHG # declares an associative array
  while read A B
  do
    ARHG[$A]=$B
    echo "in section $ini, $A is equal to"  ${ARHG["$A"]}
  done < <(awk -F'=' '/\[/ {x=0} x==1 && $0~/=/ && NF==2 {print $1, $2} $0==INI {x=1}' INI="$ini" $CFG)
  # the awk splits the file into sections, 
  # and returns pairs of values separated by "="
  declare -p ARHG # displays the current contents of ARHG
  echo
done
printf "end loop\n\n"
declare -p ARHG

Dadurch können wir Werte speichern, ohne Eval oder Backtick zu verwenden. Um "wirklich sauber" zu sein, können Sie [: space:] am Anfang und am Ende der Zeile entfernen, "^ #" - Zeilen ignorieren und Leerzeichen um das "Gleichheitszeichen" entfernen. 

0
Rich Armstrong
    # 
    #------------------------------------------------------------------------------
    # parse the ini like $0.$Host_name.cnf and set the variables
    # cleans the unneeded during after run-time stuff. Note the MainSection
    # courtesy of : http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed
    #------------------------------------------------------------------------------
    doParseConfFile(){
        # set a default cnfiguration file
        cnf_file="$run_unit_bash_dir/$run_unit.cnf"

        # however if there is a Host dependant cnf file override it
        test -f "$run_unit_bash_dir/$run_unit.$Host_name.cnf" \
            && cnf_file="$run_unit_bash_dir/$run_unit.$Host_name.cnf"

        # yet finally override if passed as argument to this function
        # if the the ini file is not passed define the default Host independant ini file
        test -z "$1" || cnf_file=$1;shift 1;


        test -z "$2" || ini_section=$2;shift 1;
        doLog "DEBUG read configuration file : $cnf_file"
        doLog "INFO read [$ini_section] section from config file"

        # debug echo "@doParseConfFile cnf_file:: $cnf_file"
        # coud be later on parametrized ...
        test -z "$ini_section" && ini_section='MAIN_SETTINGS'

        doLog "DEBUG reading: the following configuration file"
        doLog "DEBUG ""$cnf_file"
        ( set -o posix ; set ) | sort >"$tmp_dir/vars.before"

        eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
            -e 's/#.*$//' \
            -e 's/[[:space:]]*$//' \
            -e 's/^[[:space:]]*//' \
            -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
            < $cnf_file \
            | sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

        ( set -o posix ; set ) | sort >"$tmp_dir/vars.after"

        doLog "INFO added the following vars from section: [$ini_section]"
        cmd="$(comm -3 $tmp_dir/vars.before $tmp_dir/vars.after | Perl -ne 's#\s+##g;print "\n $_ "' )"
        echo -e "$cmd"
        echo -e "$cmd" >> $log_file
        echo -e "\n\n"
        sleep 1; printf "\033[2J";printf "\033[0;0H" # and clear the screen
    }
    #eof func doParseConfFile
0
Yordan Georgiev