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]
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
[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.
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
[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…)
j’arrive à extraire et à parser par contre je bloque car il ne prend que la dernière ligne
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
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 ?
[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"
[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.