#1 Le 06/10/2008, à 17:52
- thurston
[RESOLU] Boucle For à 2 entrées, avec fichier externe
Bonjour,
Une boucle for à une entrée, c'est connu. Je bute sur une boucle à 2 entrées, à savoir:
exemple à une entrée
#!/bin/bash
liste_mot="1 2 3 4 5 6 7"
for mot in $liste_mot
do
echo $mot
done
exemple à 2 entrées
j'ai une fonction backup à 2 entrées, à savoir une variable: source et une variable destination
exemple: backup home sauvegarde
J'ai une liste de répertoires à backuper du style
home1 sauvegarde1
home2 sauvegarde2
home3 sauvegarde3
Comment écrire élégamment une boucle avec un couple en entrée du style:
for couple in liste_de_couple
do
backup couple[1] couple[2]
done
Dois je écrire un tableau pour chaque couple, ou un tableau pour toutes les sources, puis un tableau pour toutes les destinations?
J'espère etre clair.
L'idée principale est donc de faire un boucle sur + qu'une variable
D'avance merci
amitiés
Thurston
Dernière modification par thurston (Le 06/10/2008, à 21:30)
Hors ligne
#2 Le 06/10/2008, à 18:12
- frafa
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
lo
par exemple avec _ comme separateur de liste
liste_mot="1 2 3 4 5 6 7 _ aa bb _cc dd"
echo -e "$liste_mot" | tr '_' '\n' | while read ligne
do
echo $ligne
done
Hors ligne
#3 Le 06/10/2008, à 18:18
- Link31
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
#!/bin/bash
IFS=$'\n'
for line in $(<le_fichier)
do
unset IFS
array=($line)
backup "${array[0]}" "${array[1]}"
done
unset IFS
"le_fichier" contient :
home1 sauvegarde1
home2 sauvegarde2
home3 sauvegarde3
Hors ligne
#4 Le 06/10/2008, à 18:25
- HP
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
Je mettrais tout ça dans une fonction pour que IFS soit local (locale)… ce qui éviterait de devoir faire un unset…
enfin, sinon… je pense que c'est la proposition de Link31 qui tient le plus la route… et qui a la meilleure syntaxe, à mon goût.
sachant que le "le_fichier" pourrait tout aussi bien être un here-doc
Dernière modification par HP (Le 06/10/2008, à 18:31)
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#5 Le 06/10/2008, à 19:54
- thurston
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
Bonjour à tous,
les propositions sont effectivement très pertinentes. Merci pour vos réponses. Effectivement la proposition de Link31 semble ok.
N'y a t il pas moyen de faire simplement un array initial et de piocher dedans dans la boucle for? J'ai l'impression que c'est la proposition de HP...
Néanmoins, le fichier détaché me parait une très bonne idée...
En effet, c'est bien dans l'esprit du script, et cela n'alourdit pas ce dernier. (plus qu'un fichier à changer et charger, très "compréhensible" où sont recensées les backup à effectuer.)
Je teste de suite
Merci
Thurston
Hors ligne
#6 Le 06/10/2008, à 20:09
- HP
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
~> man bash
/Here Documents
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#7 Le 06/10/2008, à 20:16
- thurston
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
Ok HP.
Une question: je tente de rentrer des chemins de repertoires avec des espaces et bien évidemment, l'array créé ne fonctionne plus.
Comment décomper la source et la destination avec des chemins
"source avec des espaces" "destination avec des espaces"
Merci
A+
thurston
Hors ligne
#8 Le 06/10/2008, à 20:53
- HP
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
OLDIFS="$IFS"
IFS=$'\n'
for line in $(cat <<EOF
Mes images : Mon backup images
Mes documents : Mon backup documents
EOF
); do
IFS=":"
array=($line)
echo "${array[0]} -> ${array[1]}"
# réinitialisation
IFS="$OLDIFS"
done
pas très optimisé… c'est assez horrible, mais ça devrait fonctionner…
les ':' ne doivent pas être autorisés sous Linux dans les noms de fichiers… donc ça devrait pas être gênant… on aurait pu tout aussi bien choisir des virgules, ou des points virgules, mais eux pourraient se trouver dans les noms des fichiers. Peut être qu'il faudrait rajouter un espace de part et d'autre du séparateur (mais pas avec IFS…), et/ou utiliser une syntaxe assez stricte sur ce point dans le document inclus, à voir, mais c'est fort probable .
OLDIFS, un peu comme la variable d'environnement OLDPWD… mais comme dit, ça serait plus propre avec des variables locales.
Dernière modification par HP (Le 06/10/2008, à 21:20)
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#9 Le 06/10/2008, à 21:09
- thurston
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
Ok merci, je viens de comprendre le fonctionnement deIFS. Il semble impossible d'y mettre la balise suivante
' => ', qui aurait été sympa pour le fichier source, puisque cela aurait donné:
source\avec des espaces\doc => backup\encore des espaces\tresor
Merci pour le coup de main, si info sur la manipulation d'IFS, je cherche sur google en //
A+
Thurston
Hors ligne
#10 Le 06/10/2008, à 21:41
- Link31
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
OLDIFS="$IFS"
...
IFS="$OLDIFS"
C'est une façon bien compliquée d'écrire :
IFS=...
unset IFS
Hors ligne
#11 Le 06/10/2008, à 21:46
- HP
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
de toute façon, j'aurais fait une fonction… avec des variables locales…
local IFS=$'\n'
comme ça, pas besoin de se soucier de réinitialiser, ou autre…
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#12 Le 06/10/2008, à 22:13
- HP
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
Ok merci, je viens de comprendre le fonctionnement deIFS. Il semble impossible d'y mettre la balise suivante
' => ', qui aurait été sympa pour le fichier source, puisque cela aurait donné:source\avec des espaces\doc => backup\encore des espaces\tresor
#!/bin/bash
function trim () {
echo "$(expr "$1" : '[ ]*\(.*[^ ]\)[ ]*$')"
}
function backup () {
local IFS=$'\n'
local files="$(readfile)"
for line in $files
do
initial=$(trim $(awk -F "=>" '{print $1}' <<< "$line"))
backupd=$(trim $(awk -F "=>" '{print $2}' <<< "$line"))
echo "${initial} -> ${backupd}"
done
}
function readfile () {
cat <<EOF
Mes images => Mon backup images
Mes documents => Mon backup documents
EOF
}
backup
# Local Variables:
# mode: Shell-script
# coding: mule-utf-8
# End:
Voilà… c'est probablement pas ce qu'il y a de mieux… mais, moi aussi, j'essaie de progresser
Dernière modification par HP (Le 06/10/2008, à 22:29)
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#13 Le 07/10/2008, à 12:53
- thurston
Re : [RESOLU] Boucle For à 2 entrées, avec fichier externe
Salut HP,
Vraiment merci pour le coup de main.
Ton script est très instructif.
Je m'en vais faire un mix de vos scripts respectifs.
A+
Thurston
Hors ligne