J'ai un souci avec un script bash me permettant de réaliser des sauvegardes/synchronisation avec rsync vers un disque dur externe.
Mon script utilise un fichier texte qui liste tous les paramètres des commandes rsync à réaliser. Cela me permet de facilement paramétrer ma sauvegarde qui comprends plusieurs rsync différents à réaliser et c'est plus claire également que de le faire dans le script où il y a d'autres choses etc.
Chaque ligne du fichier texte est un rsync à effectuer avec : la source, la destination et les options de rsync à utiliser. Ces 3 champs de données de mon fichier texte sont séparés par des tabulations. et s'il y a plusieurs options pour rsync elles sont séparées par des espaces.
Le fichier texte "list_rsync.txt" ressemble à celui ci-dessous /!\ j'ai représenté les tabulations avec le symbole "->" :
Code : Tout sélectionner
$ cat list_rsync.txt
/home/xxx/Documents/ -> /media/xxx/Documents -> --progress --delete-after
/home/xxx/Documents/fichier1.txt -> /media/xxx/Documents/fichier1_\$(date + '%Y_%m_%d').txt -> --progress
Code : Tout sélectionner
## lecture du fichier list_rsync.txt
nom_fic_list_sync="list_rsync.txt"
mapfile -t list_fic < "$nom_fic_list_sync" # ouverture et lecture du fichier list_rsync.txt ligne par ligne pour le mettre dans le tableau list_fic sans le caractère de fin de ligne (-t)
OIFS="$IFS" # sauvegarde ancienne valeur de IFS pour la remettre après
for i in "${!list_fic[@]}";do
if [ ! -z "${list_fic[$i]}" -a ! "${list_fic[$i]}" = $'\n' -a ! "${list_fic[$i]:0:1}" = "#" ];then # test si ligne vide ou retour chariot ou ligne de commentaire : ne rien faire
IFS=$'\t' # définition du délimiteur interne pour les tabulations
read -a list_tmp_line <<< "${list_fic[$i]}" # lecture de la ligne dans un tableau avec séparateur tabluation
source_rsync="${list_tmp_line[0]}" # source rsync
dest_rsync="${list_tmp_line[1]}" # destination rsync
eval "source_rsync=$source_rsync" # interprétation de source ?
eval "dest_rsync=$dest_rsync" # interprétation de destination ?
if [ ! -z "${list_tmp_line[2]}" ];then
option_rsync=("--update")
else
IFS=$' '
eval "option_rsync=(${list_tmp_line[$i,2]})" # options rsync
fi
IFS="$OIFS"
rsync -avhn "${option_rsync[@]}" "$source_rsync" "$dest_rsync"
fi
done
IFS="$OIFS" # reset variable IFS
J'en viens à mon problème : mon script qui lit le fichier "list_rsync.txt" bug lorsqu'il doit interpréter la commande "date" du nom de fichier de destination pour le rsync correspondant à la deuxième ligne du fichier.
Je suis débutant en shell... et j'ai compris qu'il fallait que j'utilise "eval" notamment pour les options de rsync. Et cela fonctionne pour les options seulement. Sinon la commande rsync considère qu'elles ne représentent qu'un seul paramètre lors de l’exécution... ce qui posait problème lorsqu'il y a deux paramètres ou plus car séparés par des espaces.
Mais concernant la date du fichier qu'il faut interpréter pour que rsync l’exécute correctement, je ne comprends pas pourquoi cela ne fonctionne pas avec les "eval" que j'ai essayé de faire en amont du rsync.
il en est de même si je mets des variables dans les noms des répertoires source ou destination par exemple : $doc qui serait définit et exporté dans mon .bashrc comme étant /home/xxx.
J'espère avoir été clair au maximum ?!
Merci de votre aide !!
Au delà du fonctionnement de ce script, je voudrais comprendre la logique de bash dans ce genre de cas sur le fonctionnement des variables et leur développement/interprétation.
