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 12/11/2018, à 13:16

jako

[Résolu] bash variable "dynamique"

Bonjour à tous,
Pour m'amuser, j'essaie de pondre un petit script de renommage pour transformer des phrases en nom de fichier sans espace et avec une majuscule à la première lettre de chaque mot. Par exemple "un nom de fichier avec espace.mp3" deviendrait "UnNomDeFichierAvecEspace.mp3", le but est de renommer des podcasts de france inter.
Tant que je connais le nombre de mot, tout va bien, mais comme il est toujours différent dans la vraie vie, la variable de mon compteur de boucle est dynamique et là ça coince. Je vous propose une version light de mon script qui montre que ce qui ne marche pas. J'ai bien lu sur des forums qu'il faudrait passer par un tableau mais je ne comprends pas comment cela peut m'aider.

#!/bin/bash
nbMot=$(echo $1 | wc -w )
for i in `seq 1 $nbMot`
do
mot$i=`echo "$1" | cut -f$i -d ' ' | sed 'y/àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜñ/aaceeeeiioouuAACEEEEIIOOUUn/'`

prem$i=`echo "$mot$i" | cut -c1  | tr [a-z] [A-Z]`

rest$i=`echo "$mot$i" | cut -c2-`


mot$i=$prem$i"$rest$i

echo $mot$i

done

Je ne suis vraiment pas un spécialiste et j'apprécierais une petite aide SVP ou au moins une direction vers une solution.

Bonne journée

Dernière modification par jako (Le 12/11/2018, à 22:16)

Hors ligne

#2 Le 12/11/2018, à 13:26

Postmortem

Re : [Résolu] bash variable "dynamique"

Salut,
Tu peux plutôt faire comme ceci :

$ var='a b c d'
$ echo "$var"
a b c d
$ var=${var// }
$ echo "$var"
abcd

Et protège toujours tes variables avec des guillemets (on ne les protège pas quand on sait pourquoi on le fait) :

$ var='a       b'
$ echo $var
a b
$ echo "$var"
a       b

Edit :
Pour des variables dynamiques, il y a l'option « -n » de declare dans les versions récentes de bash :

$ declare -n var_dyn
$ var=toto
$ toto=valeur
$ var_dyn=$var
$ echo "$var_dyn"
valeur

Dernière modification par Postmortem (Le 12/11/2018, à 13:33)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 12/11/2018, à 13:46

pingouinux

Re : [Résolu] bash variable "dynamique"

Bonjour,
Voici déjà une indication partielle :

$ sed -r 's/^\w/\u&/;s/\s+(\w)/\U\1\E/g' <<<"un nom    de fichier        avec espace.mp3"
UnNomDeFichierAvecEspace.mp3

Édité : Correction pour traiter plusieurs espaces ou tabulations consécutives

Dernière modification par pingouinux (Le 12/11/2018, à 14:02)

Hors ligne

#4 Le 12/11/2018, à 16:12

jako

Re : [Résolu] bash variable "dynamique"

quelle réactivité, la classe. Merci à vous 2
@pingouinux: très fort (je suis très loin de ce niveau) mais j'ai oublié de préciser que mon script doit tourner sur mon tph avec "termux" qui ne dispose que d'un SED du pauvre fourni par busybox. C'est pourquoi je n'utilise que des commande de bases. Je garde ta proposition sous le coude pour mon PC sous mint.
@Postmortem.: je vais fouiller ton info sur "declare", merci

je pensais n’être pas très loin de réussir, voyez la première erreur de chaque boucle est presque ce que je veux obtenir "mot1=un"

pascal@zugor ~/Vidéos $ ./renomme2.sh un\ autre\ avec\ des\ trous.txt 
./renomme2.sh: ligne 5: mot1=un : commande introuvable
./renomme2.sh: ligne 7: prem1=1 : commande introuvable
./renomme2.sh: ligne 9: rest1= : commande introuvable
./renomme2.sh: ligne 12: mot1=11 : commande introuvable
1
./renomme2.sh: ligne 5: mot2=autre : commande introuvable
./renomme2.sh: ligne 7: prem2=2 : commande introuvable
./renomme2.sh: ligne 9: rest2= : commande introuvable
./renomme2.sh: ligne 12: mot2=22 : commande introuvable
2
./renomme2.sh: ligne 5: mot3=avec : commande introuvable
./renomme2.sh: ligne 7: prem3=3 : commande introuvable
./renomme2.sh: ligne 9: rest3= : commande introuvable
./renomme2.sh: ligne 12: mot3=33 : commande introuvable
3
./renomme2.sh: ligne 5: mot4=des : commande introuvable
./renomme2.sh: ligne 7: prem4=4 : commande introuvable
./renomme2.sh: ligne 9: rest4= : commande introuvable
./renomme2.sh: ligne 12: mot4=44 : commande introuvable
4
./renomme2.sh: ligne 5: mot5=trous.txt : commande introuvable
./renomme2.sh: ligne 7: prem5=5 : commande introuvable
./renomme2.sh: ligne 9: rest5= : commande introuvable
./renomme2.sh: ligne 12: mot5=55 : commande introuvable
5

Dernière modification par jako (Le 12/11/2018, à 16:13)

Hors ligne

#5 Le 12/11/2018, à 18:53

Watael

Re : [Résolu] bash variable "dynamique"

c'est pourtant si simple :

$ ligne='transformer des phrases en nom de fichier sans espace et avec une majuscule à la première lettre de chaque mot'
$ for i in $ligne; do printf '%s' "${i^}"; done; echo
TransformerDesPhrasesEnNomDeFichierSansEspaceEtAvecUneMajusculeÀLaPremièreLettreDeChaqueMot
$

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 12/11/2018, à 19:01

erresse

Re : [Résolu] bash variable "dynamique"

@Watael: Tu n 'aurais pas l'explication du pourquoi "commande introuvable" à chaque ligne (juste à titre de formation) ?


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#7 Le 12/11/2018, à 19:12

pingouinux

Re : [Résolu] bash variable "dynamique"

$ i=1
$ mot$i=un
mot1=un: command not found

$ eval mot$i=un
$ echo $mot1
un

Hors ligne

#8 Le 12/11/2018, à 19:17

erresse

Re : [Résolu] bash variable "dynamique"

Merci pingouinux, je pense que cette réponse sera utile à jako (autant qu'à moi, d'ailleurs) pour comprendre pourquoi son script était foireux... C'est toujours plus formateur que de fournir une solution toute faite qui fonctionne.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#9 Le 12/11/2018, à 19:25

Watael

Re : [Résolu] bash variable "dynamique"

mots[i++]=mot_1
mots[i++]=mot_2
echo "${mots[@]}"

EVAL, C'EST MAL!!!
smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 12/11/2018, à 20:05

pingouinux

Re : [Résolu] bash variable "dynamique"

Watael a écrit :

EVAL, C'EST MAL!!!

Je m'attendais à cette remarque… smile

Hors ligne

#11 Le 12/11/2018, à 20:35

Watael

Re : [Résolu] bash variable "dynamique"

c'était écrit. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 12/11/2018, à 21:35

Postmortem

Re : [Résolu] bash variable "dynamique"

Moi suis pas d'accord, eval est pratique quand tu te retrouves dans un shell sans tableaux et simplifie vachement le code des fois.
Le tout, s'est de bien contrôler ce qu'on donne à eval.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#13 Le 12/11/2018, à 21:42

Watael

Re : [Résolu] bash variable "dynamique"

il y a toujours une manière de ne pas utiliser eval.

si ça semble indispensable, l'algo peut/doit être repenser.

--
quand je risque de marcher dans la crotte en prenant un raccourci, je prends le chemin le plus long.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 12/11/2018, à 21:58

Postmortem

Re : [Résolu] bash variable "dynamique"

On peut pas tout le temps faire ce qu'on veut, on subit l'existant des fois.
Et si le détour est 10 fois plus long...
Et comme je le disais, le tout est de contrôler ce qu'on donne à eval et là, y'a aucun risque.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#15 Le 12/11/2018, à 22:13

jako

Re : [Résolu] bash variable "dynamique"

c'est super, merci beaucoup à Watael et à tous les autres pour ces réponses constructives. Je vais désosser vos solutions et remarques pour essayer de comprendre.
Au plaisir

Dernière modification par jako (Le 13/11/2018, à 06:21)

Hors ligne