#26 Le 16/10/2008, à 13:54
- Alucard95
Re : stocker le résultat d'une commande dans un tableau en shell
Alucard95 a écrit :tiky a écrit :Essaie ceci avec bash:
#!/bin/bash IFS=' ' table=( $(ls) ) echo ${table[0]}
J'ai bien fait un copier/coller de ce code et j'obtiens ceci:
$ sh mon_script.sh
mon_script.sh: 4: Syntax error: "(" unexpectedje remet les guillemets et je retrouve l'erreur bad substitution
Ne MET pas sh devant... je veux justement qu'il soit interprété par bash et pas par dash... et toi tu lui demandes exactement le contraire !
Et quand tu mes des doubles quotes ( les guillemets c'est ça «» ), tu dis ceci à ton shell:
Merci de pas faire de word splitting dans la chaîne qui suit. Donc forcément, tu n'obtiens pas un tableau.
Moi être confus
Ton code fonctionne bien, c'est moi qui merdoullait
Hors ligne
#27 Le 16/10/2008, à 13:58
- tiky
Re : stocker le résultat d'une commande dans un tableau en shell
C'est pas grave, mais le défaut de cette syntaxe c'est qu'elle est spécifique à bash. Sur ma gentoo, sh = bash, donc ça me pose pas de problème. Par contre tu peux tout à fait utiliser la syntaxe de HP pour ta commande:
for $mac in $( ta_commande )
do
...
done
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#28 Le 16/10/2008, à 14:05
- Alucard95
Re : stocker le résultat d'une commande dans un tableau en shell
D'accord, je vais voir ça.
En tout cas merci de votre aide, mon projet à un peu progresser grâce à vous!!
Hors ligne
#29 Le 16/10/2008, à 14:17
- Alain.g
Re : stocker le résultat d'une commande dans un tableau en shell
#!/bin/bash index=0 for file in *; do table["$index"]="$file" index+=1 done echo ${table[0]}
En l'occurrence on peut arriver plus simplement au même résultat :
#!/bin/bash
table=(*)
echo "${table[0]}"
Xubuntu Karmic !
Hors ligne
#30 Le 16/10/2008, à 14:30
- tiky
Re : stocker le résultat d'une commande dans un tableau en shell
Bien vu, mais de toute façon, il faut mieux faire une boucle for pour ce qu'il veut faire.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#31 Le 16/10/2008, à 18:12
- Alain.g
Re : stocker le résultat d'une commande dans un tableau en shell
il faut mieux faire une boucle for pour ce qu'il veut faire.
Utiliser une boucle for avec une substitution de commande ne posera sûrement pas de problème dans ce cas, mais il est plus prudent d'utiliser une boucle while par éviter l'interprétation de certains caractères.
Xubuntu Karmic !
Hors ligne
#32 Le 20/05/2015, à 13:00
- fbj
Re : stocker le résultat d'une commande dans un tableau en shell
Bonjour à tous,
C'est mon tout premier post ici !
Je remonte ce sujet, car je cherche à faire quelque chose de similaire : stocker une commande complexe dans une variable, puis l'exécuter.
Le but est de renommer des fichiers texte en fonction du nom du dossier parent, en ayant pris soin de gérer les espaces éventuels dans les noms, et de ne garder que les 10 premiers caractères du nom de dossier parent, pour éviter les noms à rallonge. Précision utile : je ne suis pas un spécialiste du code ou du shell, mon script est très "pas à pas", car je n'ai pas forcément le niveau pour faire des choses complexes au niveau substitution. Soyez donc indulgents !
Voici mon code :
#!/bin/bash
cd "$1"
for i in $(find "$1"| tr -d [:blank:] | grep "txt" | awk -F"/" '{print$(NF-0)}')
do
read cfl <<<$(pwd | awk -F"/" '{print$(NF-0)}'| tr -d [:blank:])
read cf <<<${cfl:0:10}
nomlong=$(echo $cf\_$i)
source=$(echo $1\/$i | sed "s/ /\\\ /")
dest=$(echo $1\/$nomlong | sed "s/ /\\\ /")
command=$(echo 'mv' $source $dest)
$command
done
exit
Mon problème est le suivant : si je fais echo $command, les commandes 'mv' successives apparaissent et semblent bien formulées, par contre quand je retire 'echo' pour que le commande s'exécute, ça ne marche pas et j'obtiens un message de rappel de l'usage de la commande mv pour chaque fichier à modifier :
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
Je suis sûr que ça doit être tout bête, mais je ne vois pas où est l'erreur ?
Merci d'avance pour votre aide.
Hors ligne
#33 Le 20/05/2015, à 15:19
- grigouille
Re : stocker le résultat d'une commande dans un tableau en shell
Pourtant cela devrait fonctionner :
$ cat test.sh
#!/bin/bash
command='mv toto tata'
$command
$ touch toto && ./test.sh && ls
tata test.sh
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#34 Le 20/05/2015, à 16:20
- Watael
Re : stocker le résultat d'une commande dans un tableau en shell
salut,
ce "stockage" d'une commande dans une variable n'a aucun intérêt !
de plus, il est plutôt conseillé, lorsqu'une même commande doit être exécutée, d'utiliser une fonction.
ici (je le dis encore) ça n'a aucun intérêt : utilise simplement la commande.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#35 Le 21/05/2015, à 05:49
- pingouinux
Re : stocker le résultat d'une commande dans un tableau en shell
Bonjour fbj,
Il est vraisemblablement possible de simplifier ce que tu as fait. Il faudrait que tu montres un exemple de ce que tu souhaites faire (chemin complet d'un fichier source, chemin complet de la destination).
Mettre la commande dans une variable est possible mais complique les choses, et nécessite des "contorsions" lorsque les paramètres contiennent des espaces (voir Watael #34).
Hors ligne
#36 Le 22/05/2015, à 13:56
- fbj
Re : stocker le résultat d'une commande dans un tableau en shell
Bonjour à tous,
Merci pour ces réponses. L'intérêt principal de cette méthode est... que je ne sais pas comment faire autrement. Comme dit dans mon post initial, je ne suis pas un spécialiste de la question, et mes maigres connaissances en code remontent à un peu de BASIC dans les années 80, ce qui doit se voir dans la manière de rédiger mon script.
Et l'autre raison, c'est que c'est inclus dans une boucle et que des variables... varient en fonction de paramètres extérieurs, qui vont faire varier la ligne de commande à exécuter. Il y a certainement moyen de faire autrement, mais je ne sais tout simplement pas comment faire.
Le principe du script voulu le suivant : utiliser find pour fouiller dans une arborescence complexe, avec des dossiers et sous-dossiers, et renommer tous les fichiers textes (il y en a des milliers en tout) qui se trouvent à l'intérieur de cette arborescence afin de rajouter en début de nom de fichier le nom du dossier parent pour chaque fichier. Il n'y a pas de besoin de déplacer les fichiers. Un exemple :
/dossier_toto
/dossier_tata
fichier01
fichier02
fichier03
/dossier_tutu
fichier01
fichier02
fichier03
fichier04
fichier01
fichier02
fichier03
Deviendrait :
/dossier_toto
/dossier_tata
dossier_tata_fichier01
dossier_tata_fichier02
dossier_tata_fichier03
/dossier_tutu
dossier_tutu_fichier01
dossier_tutu_fichier02
dossier_tutu_fichier03
dossier_tutu_fichier04
dossier_toto_fichier01
dossier_toto_fichier02
dossier_toto_fichier03
Les plus perspicaces auront remarqués que dans mon exemple, les fichiers ont toujours les mêmes noms, ce qui reflète exactement la réalité, et est le but du script : que chaque fichier ait désormais un nom unique issu du dossier parent, en gardant son nom d'origine comme "suffixe".
Je vais me pencher sur la possibilité de le faire par une fonction, ça me rappelle vaguement quelques trucs en BASIC... GOSUB et tout ça...
Hors ligne
#37 Le 22/05/2015, à 16:22
- pingouinux
Re : stocker le résultat d'une commande dans un tableau en shell
Ceci devrait convenir
#!/bin/bash
cd "$1"
while read fic
do
bsn=$(basename "$fic")
dir=$(dirname "$fic")
bsn_dir=$(basename "$dir")
mv -i "$fic" "$dir/$bsn_dir"_"$bsn"
done < <(find -type f)
À lancer ainsi
./le_script répertoire_de_départ
Et si tu veux te limiter aux fichiers se terminant par .txt, tu remplaces la dernière ligne du script par
done < <(find -type f -name \*.txt)
Hors ligne
#38 Le 24/05/2015, à 14:10
- fbj
Re : stocker le résultat d'une commande dans un tableau en shell
Merci, ça marche !!!
J'ai juste modifié la ligne 8 comme suit :
bsn_dir=$(basename "$dir" | tr -d [:blank:])
Afin de retirer les espaces éventuels des noms de dossiers des nouveaux noms de fichiers.
Hors ligne
#39 Le 24/05/2015, à 14:17
- Zakhar
Re : stocker le résultat d'une commande dans un tableau en shell
Désolé, j'ai pas lu tout le fil... mais je te conseille de concevoir autrement qu'avec un 'tableau'.
Utiliser un tableau est un "bashism", et ça rend ton script largement moins portable.
Quelques infos sur les "bashism" : https://wiki.ubuntu.com/DashAsBinSh
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#40 Le 28/05/2015, à 18:39
- fbj
Re : stocker le résultat d'une commande dans un tableau en shell
J'y comprends rien à ton truc. C'est pas pour moi.
Hors ligne