#1 Le 12/11/2018, à 12: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, à 21:16)
Hors ligne
#2 Le 12/11/2018, à 12: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, à 12:33)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 12/11/2018, à 12: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, à 13:02)
Hors ligne
#4 Le 12/11/2018, à 15: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, à 15:13)
Hors ligne
#5 Le 12/11/2018, à 17: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.
En ligne
#6 Le 12/11/2018, à 18: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 le problème solutionné, 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, à 18: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, à 18: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 le problème solutionné, 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, à 18:25
- Watael
Re : [Résolu] bash variable "dynamique"
mots[i++]=mot_1
mots[i++]=mot_2
echo "${mots[@]}"
EVAL, C'EST MAL!!!
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#10 Le 12/11/2018, à 19:05
- pingouinux
Re : [Résolu] bash variable "dynamique"
EVAL, C'EST MAL!!!
Je m'attendais à cette remarque…
Hors ligne
#11 Le 12/11/2018, à 19:35
- Watael
Re : [Résolu] bash variable "dynamique"
c'était écrit.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#12 Le 12/11/2018, à 20: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, à 20: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.
En ligne
#14 Le 12/11/2018, à 20: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, à 21: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, à 05:21)
Hors ligne