Vérifier variables d'un fichier de conf

Bonjour,

Je stock des variables dans un fichier .conf, un exemple :

SRCDS_FOLDER_NAME="serv00_l4d2"

# Nom du screen
SRCDS_SCREEN="${SRCDS_FOLDER_NAME}"

# Nom du jeu a lancer
# Ex: l4d2 => left4dead2
# Ex: counter-strike source => cstrike
# Ex: counter-strike go => csgo
# Ex: tf2 => tf
SRCDS_GAME_NAME="left4dead2"

# Adresse IP
SRCDS_IP="192.168.1.2"

# Tickrate
SRCDS_TICKRATE=""

mais le problème est que je ne trouve pas comment vérifier si une variable est vide dans une boucle.

car faire un if [ -z MAVAR ] ne ferait pas très propre… et surtout que l’utilisateur peut lui même ajouter une variable.

en faisant :

for variable in "$TEST" do eval valeur=\$$variable if test -z "$valeur" then echo "ERREUR: La variable $variable est actuellement vide" fi done

Le problème est que la variable $TEST contient tout en un alors que je voudrais avoir un résultat :
for variable in “$SRCDS_SCREEN” “$SRCDS_GAME_NAME” “$SRCDS_IP” "$SRCDS_TICKRATE"
do
eval valeur=$$variable
if test -z "$valeur"
then
echo "ERREUR: La variable $variable est actuellement vide"
fi
done[/code]

en espérant avoir été assez explicite.

Cordialement,

Bonjour

je viens de faire ça:

[code]michel@debG53SW:~$ cat > test.conf
SRCDS_FOLDER_NAME=“serv00_l4d2”

Nom du screen

SRCDS_SCREEN="${SRCDS_FOLDER_NAME}"

Nom du jeu a lancer

Ex: l4d2 => left4dead2

Ex: counter-strike source => cstrike

Ex: counter-strike go => csgo

Ex: tf2 => tf

SRCDS_GAME_NAME=“left4dead2”

Adresse IP

SRCDS_IP=“192.168.1.2”

Tickrate

SRCDS_TICKRATE=""
^C
michel@debG53SW:~$ grep ‘""’ test.conf
SRCDS_TICKRATE=""
michel@debG53SW:~$ rm test.conf
michel@debG53SW:~$[/code]

=====

Ou alors, si j’ai mal compris, transmet un retour de

oui tu n’a pas compris, je vais essayer de faire mieux.

Dans le code :

for variable in "$TEST" do eval valeur=\$$variable if test -z "$valeur" then echo "ERREUR: La variable $variable est actuellement vide" fi done

Je voudrais que la variable $TEST regroupe toutes les variables du fichier .conf sous la forme :

for variable in "SRCDS_SCREEN" "SRCDS_GAME_NAME" "SRCDS_IP" "SRCDS_TICKRATE" do eval valeur=\$$variable if test -z "$valeur" then echo "ERREUR: La variable $variable est actuellement vide" fi done

Actuellement un echo $TEST retourne :

[quote]
SRCDS_USER=“serveur” SRCDS_FOLDER_NAME=“serv00_l4d2” SRCDS_SCREEN="${SRCDS_FOLDER_NAME}" SRCDS_GAME_NAME=“left4dead2” SRCDS_IP=“192.168.1.40” SRCDS_TICKRATE=""[/quote]

Pour inclure ton fichier de conf (et donc tes variables) dans ton script, et les tester, tu peux le faire par exemple comme ceci :

#!/bin/bash
#
. /mon/fichier.conf

if [[ -z "$MAVAR" ]]; then
 echo "houla pas bon!"
else
 ....
fi

voir le [mono]man bash[/mono] à la ligne 2415

C’est hyper dangereux c’que vous faites les gars, c’est sujet à de l’injection de code bien comme il faut (que ce soit avec eval ou source).

J’ai pas bien compris l’objectif, mais peut être que ma fonction [mono]load[/mono] de mon moteur de template.

Si tu tiens à exécuter du code il n’y a rien de décidable et systématiquement possibilité de faille.

[quote]#!/bin/bash
#####################################################################

LICENCE PUBLIQUE RIEN À BRANLER[/quote]

J’adore ton “franc-écrit” !!

@Agent:

[quote]car faire un if [ -z MAVAR ] ne ferait pas très propre… et surtout que l’utilisateur peut lui même ajouter une variable.[/quote] voir premier post.

@Mister, je vais regarder cela, merci.

L’objectif est simple, je voudrais vérifier toutes les variables du fichier .conf en une boucle et si l’une d’elle est vide = erreur en prenant en compte que l’utilisateur peut ajouter une variable. Enlever les commentaires et lire un fichier ligne par ligne, j’y arrive mais après je galère un peu…

@Linux c’est quoi ton problème ? edit: ok je comprends mieux lol

Souhaite-tu calculer la valeur des variables ? Par exemple :

Non, je veux simplement vérifier si une des variables est vide dans le fichier de .conf en prenant en compte qu’une variable peut être ajoutée.

Je ne peux pas mieux m’exprimer…

A vu de nez :

[code]# Write error message on stderr and die
function die() {
echo “$@” >&2
exit 1
}

Load var from properties files

function load() {
for propertie in “$@” ; do
[[ -f “${propertie}” ]] || die "load() : “${propertie}” don’t exist !“
while read ; do
[[ -n “${REPLY%%=}" && -z "${REPLY#=}” ]] || die “load() : La variable “${REPLY%%=}" est vide !"
eval "${REPLY%%=
}”=’”${REPLY#*=}”'
done < "${propertie}"
done
}[/code]

[quote=“MisterFreez”]C’est hyper dangereux c’que vous faites les gars, c’est sujet à de l’injection de code bien comme il faut (que ce soit avec eval ou source).
[/quote]
Oui en effet, je n’avais pas fait attention à ce risque mais c’est vrai que je n’utilise cette technique qu’avec des fichiers protégés contre l’écriture par des utilisateurs non autorisés.

du coup il y a des exemples pour vérifier un fichier de config, avec cette technique, là :
wiki.bash-hackers.org/howto/conffile?s[]=source
(exemple qui ne protège toujours pas dans tous les cas…)

Re,

j’arrive à extraire et à parser par contre je bloque car il ne prend que la dernière ligne :angry:

configfile="conf_srcds.conf"

#On execute le fichier de conf
. $configfile

#Extraction des variables
grep -v ^\# $configfile | grep  . | awk -F '="' '{ print $1}' | grep -v ^\PARAM | grep -v ^\UPDATE_LOG | grep -v ^\INSTALL_LOG >> file.tmp

# On ajoute " au debut et a la fin
sed -e 's/.*/"&/' file.tmp > files.tmp
sed -e 's/.*/&"/' files.tmp > file.tmp

# On parse le fichier pour avoir une sortie pas trop longue
pr -s' ' -aT --columns=6 file.tmp > files.tmp
sed -e 's/.*/& \\/' files.tmp > file.tmp
sed '$s/.$//' file.tmp > files.tmp

#echo $LOL retourne tout le fichier sans probleme
LOL=`cat file.tmp` #ou LOL="$(</file.tmp)"

for variable in $LOL
do
eval valeur=\$$variable
if test -z "$valeur" #Valeur ne retourne que la derniere ligne du fichir
then
echo "ERREUR: La variable $variable est actuellement vide"
fi
done

cat file.tmp:

echo $LOL:

Une suggestion ?

Dans ta boucle for, en ajoutant un echo $variable avant le if, toutes les variables du fichier file.tmp s’affichent chez moi.
Peux-tu faire de même et donner un retour ?

[quote=“MisterFreez”]A vu de nez :

[code]# Write error message on stderr and die
function die() {
echo “$@” >&2
exit 1
}

Load var from properties files

function load() {
for propertie in “$@” ; do
[[ -f “${propertie}” ]] || die "load() : “${propertie}” don’t exist !“
while read ; do
[[ -n “${REPLY%%=}" && -z "${REPLY#=}” ]] || die “load() : La variable “${REPLY%%=}" est vide !"
eval "${REPLY%%=
}”=’”${REPLY#*=}”'
done < "${propertie}"
done
}[/code][/quote]

Testé et corrigé une petite erreur :

fichier test.conf

VAR1="hello"
VAR2="youhou"
VAR3="13456"
VAR4=

le script

#!/bin/bash

# Write error message on stderr and die
function die() {
  echo "$@" >&2
  exit 1
}

# Load var from properties files
function load() {
  for propertie in "$@" ; do
    [[ -f "${propertie}" ]] || die "load() : \"${propertie}\" don't exist !"
    while read ; do

#echo "${REPLY%%=*}"
#echo "${REPLY#*=}"

      [[ -n "${REPLY%%=*}" && -z "${REPLY#*=}" ]] && die "load() : La variable \"${REPLY%%=*}\" est vide !"
      eval "${REPLY%%=*}"=\'"${REPLY#*=}"\'
    done < "${propertie}"
  done
}

load "test.conf"

echo "VAR1=$VAR1"
echo "VAR2=$VAR2"
echo "VAR3=$VAR3"
echo "VAR4=$VAR4"

à peaufiner mais ça fonctionne

@Flavien:

J’ai essayé en mettant eval valeur=$$variable entre “”, aucun changement.

[quote=“agentsteel”][quote=“MisterFreez”]A vu de nez :

[code]# Write error message on stderr and die
function die() {
echo “$@” >&2
exit 1
}

Load var from properties files

function load() {
for propertie in “$@” ; do
[[ -f “${propertie}” ]] || die "load() : “${propertie}” don’t exist !“
while read ; do
[[ -n “${REPLY%%=}" && -z "${REPLY#=}” ]] || die “load() : La variable “${REPLY%%=}" est vide !"
eval "${REPLY%%=
}”=’”${REPLY#*=}”'
done < "${propertie}"
done
}[/code][/quote]

Testé et corrigé une petite erreur :

fichier test.conf

VAR1="hello"
VAR2="youhou"
VAR3="13456"
VAR4=

le script

#!/bin/bash

# Write error message on stderr and die
function die() {
  echo "$@" >&2
  exit 1
}

# Load var from properties files
function load() {
  for propertie in "$@" ; do
    [[ -f "${propertie}" ]] || die "load() : \"${propertie}\" don't exist !"
    while read ; do

#echo "${REPLY%%=*}"
#echo "${REPLY#*=}"

      [[ -n "${REPLY%%=*}" && -z "${REPLY#*=}" ]] && die "load() : La variable \"${REPLY%%=*}\" est vide !"
      eval "${REPLY%%=*}"=\'"${REPLY#*=}"\'
    done < "${propertie}"
  done
}

load "test.conf"

echo "VAR1=$VAR1"
echo "VAR2=$VAR2"
echo "VAR3=$VAR3"
echo "VAR4=$VAR4"

à peaufiner mais ça fonctionne[/quote]

ou pas… La ligne 19 retourne une commande introuvable (eval…)

edit:
J’ai modifié ma variable LOL en :

FICHIER=$(eval echo $(cat file.tmp))

après de multiples tests, tout fonctionne à merveille.