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

echo $TEST

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 :

NOM_VAR="$(cat fichier)"

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.