Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

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

wink


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 wink.

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

thurston a écrit :

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 wink

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