# Erreur sur script de sauvegarde automatique

**URL:** <https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289 "2016-02-21T19:56:32Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/1 "2016-02-21T19:56:32Z")

</div>

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:

```auto
#!/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:

```auto
./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](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere") ![:013](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere")  
Celle ci en l’occurrence:

```auto
sys$i=`echo $os |cut -d ' ' -f"$i"`
```

Mon fichier de conf:

```auto
#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,

---

<div class="post-metadata">

**Author:** ![ben\_raven](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ben_raven/32/4076_2.png) [@ben\_raven](https://www.debian-fr.org/u/ben_raven)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/2 "2016-02-21T19:56:32Z")

</div>

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]

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/3 "2016-02-21T19:56:32Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/4 "2016-02-21T19:56:32Z")

</div>

`#!/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]

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/5 "2016-02-21T19:56:37Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/6 "2016-02-21T19:56:37Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/7 "2016-02-21T19:56:37Z")

</div>

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

```auto
#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 ?

```auto
#!/bin/bash
cat <<<EOF

EOF
```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/8 "2016-02-21T19:56:38Z")

</div>

## [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 :

```auto
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.

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/9 "2016-02-21T19:56:39Z")

</div>

[strike]Merci beaucoup ! Tu est vraiment fort ! ^^ ![:038](https://www.debian-fr.org/uploads/default/original/1X/08df484251490af77ba342c0331f3ee271065fe9.gif "bravo") ![:038](https://www.debian-fr.org/uploads/default/original/1X/08df484251490af77ba342c0331f3ee271065fe9.gif "bravo")  
Mon script fonctionne a merveille grâce a toi !  
Bonne journée et vive ce forum !  
jjbond,[/strike]

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/10 "2016-02-21T19:56:42Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/11 "2016-02-21T19:56:42Z")

</div>

Grrr. 😊

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

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/12 "2016-02-21T19:56:43Z")

</div>

Rajouter -x a la fin de la commande awk ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/13 "2016-02-21T19:56:43Z")

</div>

Non remplacer :

```auto

```

par

```auto

```

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/14 "2016-02-21T19:56:43Z")

</div>

```auto
+ 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=('')
```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/15 "2016-02-21T19:56:49Z")

</div>

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 :

```auto
# 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
```

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/16 "2016-02-21T19:56:50Z")

</div>

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:

```auto
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 🙂

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/17 "2016-02-21T19:56:50Z")

</div>

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 :

```auto

```

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.

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/18 "2016-02-21T19:56:50Z")

</div>

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,

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:56 UTC](https://www.debian-fr.org/t/erreur-sur-script-de-sauvegarde-automatique/61289/19 "2016-02-21T19:56:52Z")

</div>

> [@jjbond](#):
>
> Si j’ai besoin d’autre choses pour script puis-je te mp ?

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