Erreur sur script de sauvegarde automatique

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 … :013 :013
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

Merci d’avance pour vos conseils éclairés
jjbond,

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é :slightly_smiling:
je vais tester ta technique je te redis si ça fonctionne :slightly_smiling:

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.

Il me faudrait un exemple de ce qu’il y a dans ton fichier de conf’.

Le contenu du fichier de conf est dans mon 1er message ^^

#conf systeme a sauvegarder
ID: 1
os: windows
source: /mnt/windows
dest: /save/windows
ID: 2
os: linux
source: /mnt/linux
dest: /save/linux

Par contre si je peut me permettre est ce la bonne syntaxe pour le EOP ?

#!/bin/bash
cat <<<EOF

EOF

[code]#!/bin/bash
cat <<EOF

        Script de sauvegarde               
        Created by jjbond ;)               

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.

[strike]Merci beaucoup ! Tu est vraiment fort ! ^^ :038 :038
Mon script fonctionne a merveille grâce a toi !
Bonne journée et vive ce forum !
jjbond,[/strike]

Edit:
Faux espoirs … les variables $os , $id ,$dest $source sont toujours vide … :confused:

Grrr. :blush:

Tu peut ajouter -x à la fin de la toute première ligne et me montrer ce que donne l’exécution ?

Rajouter -x a la fin de la commande awk ?

Non remplacer :

par

+ var
+ os=($(extract "os" conf.ini))
++ extract os conf.ini
++ awk -F '[[:space:]]*:[[:space:]]*' -v key=os '$1==key{print $2}' conf.ini
+ id=($(extract ID conf.ini))
++ extract ID conf.ini
++ awk -F '[[:space:]]*:[[:space:]]*' -v key=ID '$1==key{print $2}' conf.ini
+ dest=($(extract dest conf.ini))
++ extract dest conf.ini
++ awk -F '[[:space:]]*:[[:space:]]*' -v key=dest '$1==key{print $2}' conf.ini
+ source=($(extract source conf.ini))
++ extract source conf.ini
++ awk -F '[[:space:]]*:[[:space:]]*' -v key=source '$1==key{print $2}' conf.ini
++ grep -cF ID conf.ini
+ postes=2
+ tabos=('')

Je pensais qu’il allait en montrer un peu plus… Je suis assez gêné que ça ne fonctionne pas.

Tu comprends la ligne de commande awk ? Tu veux que je t’explique ce qu’elle fait ?
Tu peut me montrer le résultat de :

# awk -F '[[:space:]]*:[[:space:]]*' -v key=os '$1==key{print $2}' conf.ini
# awk -F '[[:space:]]*:[[:space:]]*' -v key=os '$1==key' conf.ini
# awk -F '[[:space:]]*:[[:space:]]*' -v key=os '{print key}' conf.ini

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:

extract() {
    cat $2 | grep $1 | cut -d : -f2|cut -d ' ' -f2
}

C’est peut être du bricolage ^^ mais en attendant de trouver la solution pour la commande awk je continu mon script comme ça :slightly_smiling:

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 :

extract() { grep "$1" conf.ini | cut -d : -f2|cut -d ' ' -f2 }

Comme ça tu n’a plus à le répéter et si tu change ta manière de stocker ta conf tu n’aura qu’a modifier cette fonction.

Très bien je vais effectuer les modifs ^^ en-tout cas merci a toi pour ton aide tu m’as bien conseiller surtout avec les tableaux.

Si j’ai besoin d’autre choses pour script puis-je te mp ?
jjbond,

Pas de problème généralement, on passe par le forum pour que ça puisse éventuellement servir à d’autres.