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.

#26 Le 16/10/2008, à 14:54

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

tiky a écrit :
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: "(" unexpected

je 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 roll

Ton code fonctionne bien, c'est moi qui merdoullait big_smile

Hors ligne

#27 Le 16/10/2008, à 14: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, à 15: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!!
smile

Hors ligne

#29 Le 16/10/2008, à 15:17

Alain.g

Re : stocker le résultat d'une commande dans un tableau en shell

HP a écrit :
#!/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, à 15: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, à 19:12

Alain.g

Re : stocker le résultat d'une commande dans un tableau en shell

tiky a écrit :

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, à 14: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, à 16: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, à 17: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.

Hors ligne

#35 Le 21/05/2015, à 06: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, à 14: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... roll

Hors ligne

#37 Le 22/05/2015, à 17: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, à 15:10

fbj

Re : stocker le résultat d'une commande dans un tableau en shell

Merci, ça marche !!! big_smile

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, à 15: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, à 19: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. sad

Hors ligne