Bonjour,
Me re-voila avec un autre soucis qui n’est pas forcément évident a expliquer.
Je vais tenter de m’expliquer le plus clairement possible afin que vous puissiez m’aider sur mon soucis.
Je suis entrain de réaliser un script qui a pour but de sauvegarder des clients Linux ou Windows d’une manière automatique en lisant un fichier de conf dans lequel sera présent tout les variables nécessaire.
Or dans mon début de script j’ai une erreur étrange que je n’arrive pas a résoudre et qui m’empêche de faire la suite.
ci joint mon script:
#!/bin/bash
echo "----------------------------------------------------------------------------"
echo " Script de sauvegarde "
echo " Created by jjbond ;) "
echo "----------------------------------------------------------------------------"
function var { # on récupère les variables
os=`cat conf.ini| grep os | cut -d ':' -f2 | cut -d ' ' -f2` # os des machines
id=`cat conf.ini| grep ID | cut -d ':' -f2 | cut -d ' ' -f2` # id des machines
dest=`cat conf.ini | grep 'dest'| cut -d ':' -f2 | cut -d ' ' -f2` # repertoire de destination
source=`cat conf.ini | grep 'source'| cut -d ':' -f2 | cut -d ' ' -f2` # repertoire a sauvegarder
postes=`cat conf.ini | grep ID | wc -l` # nombre de machines
}
if [ -f conf.ini ]
then
var
for i in `seq 1 $postes` # pour i allant de 1 a nombre de machines
do
sys$i=`echo $os |cut -d ' ' -f"$i"`
src$i=`echo $source | cut -d ' ' -f"$i"`
dst$i=`echo $dest | cut -d ' ' -f"$i"`
done
else
echo " erreur fichier de conf illisible ou introuvable !" >> /var/log/sauvegarde/save.log
fi
L’erreur que me renvoie debian et la suivante:
./scriptsaveauto.sh: line 18: sys1=windows : commande introuvable
./scriptsaveauto.sh: line 18: sys2=linux : commande introuvable
Ce que je ne comprends pas c’est qu’il me renvoie une erreur mais il exécute bien ma commande …
Celle ci en l’occurrence:
sys$i=`echo $os |cut -d ' ' -f"$i"`
Mon fichier de conf:
#conf systeme a sauvegarder
ID: 1
os: windows
source: /mnt/windows
dest: /save/windows
ID: 2
os: linux
source: /mnt/linux
dest: /save/linux
Je ne pense pas résoudre ton pb avec ma réponse.
Mais je sais que je n’utilise quasiment plus les en bash car j'avais eu des soucis d’interprétation dans un script. Du coup je met tout le temps mes fonctions avec [code]$(MAFONCTION)[/code] plutôt que [code]MAFONCTION`[/code]
Salut ! Merci pour ta réponse
Je crois que j’ai localiser l’erreur je pense que cela vient de la variable…
Est ce possible d’incrémenter le nom d’une variable ?
ex:
$sys1
$sys2
$sysN
#!/bin/bash
echo "----------------------------------------------------------------------------"
echo " Script de sauvegarde "
echo " Created by jjbond ;) "
echo "----------------------------------------------------------------------------"
function var { # on récupère les variables
os=`cat conf.ini| grep os | cut -d ':' -f2 | cut -d ' ' -f2` # os des machines
id=`cat conf.ini| grep ID | cut -d ':' -f2 | cut -d ' ' -f2` # id des machines
dest=`cat conf.ini | grep 'dest'| cut -d ':' -f2 | cut -d ' ' -f2` # repertoire de destination
source=`cat conf.ini | grep 'source'| cut -d ':' -f2 | cut -d ' ' -f2` # repertoire a sauvegarder
postes=`cat conf.ini | grep ID | wc -l` # nombre de machines
}
if [ -f conf.ini ]
then
var
for i in `seq 1 $postes` # pour i allant de 1 a nombre de machines
do
sys$i=`echo $os |cut -d ' ' -f"$i"`
src$i=`echo $source | cut -d ' ' -f"$i"`
dst$i=`echo $dest | cut -d ' ' -f"$i"`
done
else
echo " erreur fichier de conf illisible ou introuvable !" >> /var/log/sauvegarde/save.log
fi
[ul]
[li]le fait d’utiliser une variable dans le nom de ta variable pose problème, pour lui ce n’est plus une affectation mais une commande comme une autre[/li]
[li]AMHA la solution la plus intéressante c’est d’utiliser 3 tableaux à la place de tes variables. C’est fait pour ça.[/li][/ul]
Par ailleurs si je peux me permettre, il est conseillé d’utiliser [mono]$(cmd)[/mono] à la place de [mono]cmd[/mono] (ça permet de les imbriquer facilement par exemple).
Ta fonction var pourrait être simplifiée ainsi :
[code]#!/bin/bash
cat <<<EOF
Script de sauvegarde
Created by jjbond ;)
EOF
extract() {
awk -F= -v “key=$1” ‘$1==key{sub(/.* /,"",$2);print $2}’ “$2”
}
function var { # on récupère les variables
os=$(extract “os” conf.ini) # os des machines
id=$(extract “ID” conf.ini) # id des machines
dest=$(extract “dest” conf.ini) # repertoire de destination
source=$(extract “source” conf.ini) # repertoire a sauvegarder
postes=$(grep -cF ID conf.ini) # nombre de machines
}[/code]
Bonjour,
Merci pour cette réponse rapide et efficace !
Je suis débutant en Linux ^^ comme tu as du certainement le remarqué
je vais tester ta technique je te redis si ça fonctionne
EDIT:
Lorsque j’essaye d’afficher les variables $os, $id, $dest,$source cela ne me renvoie rien …
il y a que $postes qui me renvoie la bonne valeur.
EOF
function extract {
awk -F ‘[[:space:]]:[[:space:]]’ -v “key=$1” ‘$1==key{print $2}’ “$2”
}
function var { # on récupère les variables
os=$(extract “os” conf.ini) # os des machines
id=$(extract “ID” conf.ini) # id des machines
dest=$(extract “dest” conf.ini) # repertoire de destination
source=$(extract “source” conf.ini) # repertoire a sauvegarder
postes=$(grep -cF ID conf.ini) # nombre de machines
}[/code]
Ok, on peut donc simplifier l’appel à awk (c’est là qu’on voit l’intérêt d’avoir une fonction [mono]extract()[/mono], on modifie une ligne et ça corrige tout). Au passage avec cette version ton fichier de configuration est bien plus souple (tu peut avoir un ou plusieurs espace, tabulation espace insécable avant et/ou après le « : » sans que ça gène).
Pour le [mono]cat[/mono] un chevron s’est glissé en trop (il en faut que 2).
J’en profite pour te montrer une solution pas mal :
function var { # on récupère les variables
os=( $(extract "os" conf.ini) ) # os des machines
id=( $(extract "ID" conf.ini) ) # id des machines
dest=( $(extract "dest" conf.ini) ) # repertoire de destination
source=( $(extract "source" conf.ini) ) # repertoire a sauvegarder
postes="${#id}" # nombre de machines (cette variable est-elle encore très utile ?)
}
Ce qui fait que les variables [mono]os[/mono], [mono]id[/mono], [mono]dest[/mono] et [mono]source[/mono] sont des tableaux. Tu peut remplacer :
[ul]
[li][mono]sys$i[/mono] par [mono]${os[$i]}[/mono][/li]
[li][mono]src$i[/mono] par [mono]${source[$i]}[/mono][/li]
[li][mono]dst$i[/mono] par [mono]${dest[$i]}[/mono][/li][/ul]
Bien sûr la boucle qui créée ces variables n’a plus lieue d’être.
Bonjour, merci de t’intéresser a mon soucis ^^ ça fait plaisir.
Oui j’ai compris ce que faisait la commande awk c’est le même principe du grep en plus puissant d’après ce que j’ai compris.
Le résultat des trois commandes m’affiche strictement rien d’où le vide des variables.
J’ai pris donc l’initiative de remplacer la commande de la fonction extract par celle ci:
Je ne comprends pas pourquoi ça marche chez moi et pas chez toi, mais si ça marche avec ton ancienne solution tant mieux. Je te propose par contre de retirer le cat pour :
qui est un peu plus joli.
Ensuite d’un point de vu conception, tu peut ne mettre le fichier en dur dans la fonction :