#1 Le 19/01/2016, à 22:14
- Morrisson
[RESOLU] Attribution de variable avec un for
Bonsoir,
je n'arrive pas à régler un problème d'initialisation de variable avec un "for". Je souhaite que la variable "$artist" soit égale à "$var3".
PS : je cherche la solution avec obligatoirement le "for"
let "var2 = 1"
for i in 'artist' ; do
echo -n "$i :"
var3=`sed -n "$var2"p *.info | cut -d = -f 2` #recupere par exemple David Bowie
echo $var3 #affiche "David Bowie"
$i =`echo $var3` ###Le problème est ici.
let "var2 = var2+1 "
done
echo $artist # là, je veux afficher "David Bowie"
.
Merci d'avance et bonne soiré .
Dernière modification par Morrisson (Le 20/01/2016, à 20:46)
#2 Le 19/01/2016, à 22:29
- Arbiel
Re : [RESOLU] Attribution de variable avec un for
Bonsoir
Il me semble que ce code irait mieux
let "var2 = 1"
for i in 'artist' ; do
echo -n "$i :"
var3=`sed -n "$var2"p *.info | cut -d = -f 2` #recupere par exemple David Bowie
echo $var3 #affiche "David Bowie"
i=`echo $var3` ###Le problème est ici.
let "var2 = var2+1 "
done
echo $artist # là, je veux afficher "David Bowie"
Arbiel
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#3 Le 20/01/2016, à 09:00
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
Salut,
Ce code n'est pas logique (tu fais une boucle for sur une seule valeur, qui est "artist"), j'imagine que c'est une minimisation d'un code plus complexe qui pose problème.
Je pense qu'il y a pas mal de choses simplifiables (par exemple ces "let", pas sûr qu'ils soient utiles).
Si j'ai bien compris, dans ta boucle la valeur de $i est "artist" et du coup tu voudrais mettre la valeur de $var3 dans la variable $artist.
Et donc si tu faisais "for i in artist album song", tu aurais trois occurrences de la boucle et $i vaudrait successivement ces trois valeur, du coup tu voudrais que les variables $artist, $album et $song soient successivement associées aux valeurs successives de $var3.
Si j'ai bien compris, tu n'es pas loin de la solution : je pense que la ligne problématique peut être simplfiée en :
$i="$var3"
Explication : avant d'exécuter la ligne, bash va remplacer les "$truc_bidule" par leur valeur, ce qui se traduit alors en effet comme :
artist="David Bowie"
... ce qui est bien ce que tu veux.
---
Si tu n'avais pas mis une espace en trop et si tu avais mis des guillemets, cette ligne aurait fonctionné :
$i="`echo $var3`"
... mais c'est couillon de faire un echo d'une variable dont tu peux déjà appeler la valeur
Dernière modification par tiramiseb (Le 20/01/2016, à 09:01)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#4 Le 20/01/2016, à 10:31
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
Bonjour et merci d'avoir répondu, c'est vraiment cool.
Par contre, les solutions proposées ne fonctionnent pas . Je continue à chercher et je vous tiens au courant.
Une question : peut-on envoyer un "echo" dans une ligne de commande "read "?
car le code suivant fonctionne :
let "var2 = 0"
for i in 'artist' ; do
let "var2 = var2+1 "
echo -n "$i :"
var3=`sed -n "$var2"p *.info | cut -d = -f 2`
echo $var3 #affiche David Bowie
read $i #je tape ce qu'il y a afficher à la ligne précédente ie David Bowie
done
echo $artist #affiche David Bowie
Bonne journée
Dernière modification par Morrisson (Le 20/01/2016, à 10:33)
#5 Le 20/01/2016, à 10:46
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
Par contre, les solutions proposées ne fonctionnent pas
« ça ne fonctionne pas » n'aide pas à t'aider.
Si tu veux qu'on t'aide, montre ton script, montre ce que ça dit, montre ce que tu attends... Montre des choses !!!
Pour ta dernière question, tu peux faire :
echo "$var3" | read $i
... mais c'est aussi crado que ta première idée. Si tu essayais de faire propre plutôt que de bricoler des trucs crades ?
Dernière modification par tiramiseb (Le 20/01/2016, à 10:49)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 20/01/2016, à 11:00
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
D'accord, mon objectif c'est de faire une simplification de ce code avec des boucles car si je rajoute encore des informations au fils du temps cela va devenir de plus en plus "chiant". Du coup, je voudrai initialiser mes variables avec un "for" (voir le premier code proposé).
artiste=`sed -n '1p' *.info | cut -d = -f 2
album=`sed -n '2p' *.info | cut -d = -f 2
date=`sed -n '3p' *.info | cut -d = -f 2
genre=`sed -n '4p' *.info | cut -d = -f 2
a=`sed -n '5p' *.info | cut -d = -f 2`
let " nbre = $a"
#7 Le 20/01/2016, à 11:09
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
Ok, après avoir fait des tests, bah ma ligne ne fonctionne pas, ça donne quelque chose comme ça :
artist=David Bowie : commande introuvable
Si c'est l'erreur que tu as rencontré, tu aurais dû nous le dire précisément plutôt que dire « ça ne fonctionne pas »
À ta place, je ferais une fonction plutôt qu'une boucle. Par exemple (non testé) :
getdata () {
sed -n "$1p" *.info | cut -d= -r2
}
artist=`getdata 1`
album=`getdata 2`
data=`getdata 3`
genre=`getdata 4`
a=`getdata 5`
Ensuite, j'aurais bien aimé voir le contenu de ton fichier "*.info" parce que j'ai vraiment l'impression que tu te compliques la vie : il y a quoi avant le signe "=" dans ce fichier ?
Et au-delà de cette attribution de données à des variables, que vas-tu faire avec ça ?
Si ça se trouve tu es en train de créer un gros script compliqué pour faire quelque chose qui est faisable simplement d'une autre manière...
Au fait, dans ton premier message tu as écrit :
PS : je cherche la solution avec obligatoirement le "for"
pourquoi ?
Dernière modification par tiramiseb (Le 20/01/2016, à 11:32)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 20/01/2016, à 11:29
- nany
Re : [RESOLU] Attribution de variable avec un for
Bonjour,
montre ton script
j'aurais bien aimé voir le contenu de ton fichier "*.info"
+1
En effet, personnellement, à ce stade du fil, je n’ai toujours RIEN compris à ce que Morrisson a déjà fait et ce qu’il souhaite obtenir.
Hors ligne
#9 Le 20/01/2016, à 11:37
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
Ok je suis désolé, je me suis pas bien exprimer.
Je suis entrain de faire un script pour gérer mes musiques en ".flac" et j'ai fait un script qui fonctionne plut^ot pas mal. Je cherche à le simplifié et à mettre des boucles le plus souvent possible (visuellement c'est mieux et cela optimise).
artist=Kendrick Lamar
album=Good Kid, M.A.A.D City
year=2012
genre=
numbertracks=12
01 Sherane a.k.a Master Splinter’s Daughter
02 Bitch, Don't Kill My Vibe
03 Backseat Freestyle
04 The Art of Peer Pressure
05 Money Trees
06 Poetic Justice
07 good kid
08 m.A.A.d city
90 Swimming Pools (Drank)
10 Sing About Me, I’m Dying of Thirst
11 Real
12 Compton
#10 Le 20/01/2016, à 11:42
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
un script pour gérer mes musiques en ".flac"
Ça veut dire quoi "gérer" ? Il fait quoi ce script ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#11 Le 20/01/2016, à 11:45
- nany
Re : [RESOLU] Attribution de variable avec un for
Bon, on progresse. Si je comprends bien, ça, c’est le contenu d’un fichier .info.
Maintenant, ce serait bien de pouvoir voir LA TOTALITÉ du script « qui fonctionne » ainsi que la totalité du script qui ne fonctionne pas.
Hors ligne
#12 Le 20/01/2016, à 11:50
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
nany: si on pouvait avoir une explication sur le but de ce script, ce serait déjà un bon début non ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#13 Le 20/01/2016, à 12:05
- nany
Re : [RESOLU] Attribution de variable avec un for
Voui, et comme tu as posé la question, je jugeais inutile de la répéter.
Hors ligne
#14 Le 20/01/2016, à 13:17
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
Présentation générale du script :
Requis : Imagemagick, eyeD3, metaflac
Objectif : gérer une collection de fichier flac c'est à dire:
1/ supprimer es taggs existant par des informations récupérer sur internet et mis dans des fiches noté nom.info (étape TAGGER)
2/ renommer les fichiers 01 titre.flac (étape RENOMMAGE )
3/ mettre tous les fichiers dans un dossier artiste puis album ( étape RANGER)
#!/bin/bash
###requis metaflac, imag
#Indiquer le dossier
echo 'Dossier (chemin absolue) ?'
read Dossier
echo $Dossier
cd "$Dossier"
OLDIFS=$IFS;
IFS=$(echo -en "\n\b" );
for fileA in `(ls)`;do ## parcourir un ls avec des espaces.
echo "$fileA"
cd "$fileA"
###condition et vérification des informations
# Récuperer les données de «*.info» | simplifier
artiste=`sed -n '1p' *.info | cut -d = -f 2 | cut -d ';' -f 1 | cut -d ' ' -f 2-`
album=`sed -n '2p' *.info | cut -d = -f 2 | cut -d ';' -f 1 | cut -d ' ' -f 2-`
date=`sed -n '3p' *.info | cut -d = -f 2 | cut -d ';' -f 1 | cut -d ' ' -f 2-`
genre=`sed -n '4p' *.info | cut -d = -f 2 | cut -d ';' -f 1 | cut -d ' ' -f 2-`
a=`sed -n '5p' *.info | cut -d = -f 2 | cut -d ';' -f 1 | cut -d ' ' -f 2-`
let " nbre = $a"
echo '--------------------------INFO--------------------------'
cat *.info
echo -e '\n--------------------------------------------------------'
######Pause pour voir si il y a des erreurs.
echo -e "\nLes informations sont-elles correctes ? (taper n'importe quelles touches pour continuer )"
read attente1
###Ajouter la convertion d'images
#convertir et renommer l'image présente
mv *.jpg "$artiste-$album.jpg" 2>/dev/null
convert *.jpg -resize 1000x1000\! "$artiste-$album.jpg"
#Ajouter les informations à chaque fichier
find . -maxdepth 1 -name "*.flac" -exec metaflac --remove-all {} \;
for i in `seq 1 $nbre`; do #parcours toute les chansons de .inforamtions
numTitre=`sed -n "$((5+i))p" *.info`
titre=`sed -n "$((5+i))p" *.info | cut -d " " -f 2- `
echo -n "$numTitre.........."
if [[ $i -lt 10 ]]; then ##Cas des 9 premiers chiffre 0^.
fichier=`find . -maxdepth 1 -name "0$i*"| cut -d / -f 2`
mv "$fichier" "$numTitre.flac" 2>/dev/null
eyeD3 --remove-all --remove-images "$numTitre.flac" &>/dev/null
eyeD3 --to-v2.4 "$numTitre.flac" &>/dev/null
eyeD3 -t "$titre" -a "$artiste" -A "$album" -n "0$i" -N "$nbre" -G "$genre" --add-image="$artiste-$album.jpg":FRONT_COVER {} "$numTitre.flac" &>/dev/null
else
fichier=`find . -maxdepth 1 -name "$i*"| cut -d / -f 2`
mv "$fichier" "$numTitre.flac" 2>/dev/null
eyeD3 --remove-all --remove-images "$numTitre.flac" &>/dev/null
eyeD3 --to-v2.4 "$numTitre.flac" &>/dev/null
eyeD3 -t "$titre" -a "$artiste" -A "$album" -n "0$i" -N "$nbre" -G "$genre" --add-image="$artiste-$album.jpg":FRONT_COVER {} "$numTitre.flac" &>/dev/null
fi
echo 'OK'
done
cd ../ #On resort du dossier
mv "$fileA" "$album" 2>/dev/null
mkdir "$artiste" 2>/dev/null
mv "$album" "$artiste"/ 2>/dev/null
IFS=$OLDIFS;
done
#Afficher le message de fin
echo '--------------------------END--------------------------'
La je vous met un exemple de fichier .info
Artiste= The Beatles;
Album= Revolver;
Date= 1966;
Genre= ;
Number Of Tracks= 14;
01 Taxman
02 Eleanor Rigby
03 I'm Only Sleeping
04 Love You To
05 Here, There And Everywhere
06 Yellow Submarine
07 She Said She Said
08 Good Day Sunshine
09 And Your Bird Can Sing
10 For No One
11 Doctor Robert
12 I Want To Tell You
13 Got To Get You Into My Life
14 Tomorrow Never Knows
MAINTENANT, je travaille sur une version 2 qui permettra :
1/ de vérifier les informations ( lettre majuscule à chaque mot).
2/ d'éviter d'utiliser des caractère non autoriser.
3/ de supprimer les messages d'erreurs lors du renommage.
4/ d'ajouter en tagg la date (il y a un problème avec eyeD3)
5/ de l'optimiser
et encore d'autre chose
#15 Le 20/01/2016, à 13:34
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
Tout ce que tu indiques là me semble parfaitement géré par Easytag.
Es-tu sûr que ça ne te simplifierait pas la vie d'utiliser Easytag ?
Je veux bien t'aider à faire ce script hein, mais j'ai vraiment l'impression que tu te compliques la vie...
alors d'abord je regarde si un outil "fait pour ça" ne te conviendrait pas...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#16 Le 20/01/2016, à 13:45
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
Oui Easytag fait tous ça mais il faut faire les fichiers un par un et donc c'est trés long ( j'ai pas trouver d'autres logiciels "snif snif" pour faire par groupe de fichiers ). D'ou l'idée de développer un script.
#17 Le 20/01/2016, à 13:56
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
Euh non, Easytag sait traiter les fichiers en bloc... Je l'utilise quasi-exclusivement comme ça.
La seule chose c'est que j'utilise pas les données tirées d'Internet (Easytag permet d'utiliser CDDB), alors pour les titres des morceaux je fais parfois un traitement au cas par cas.
Mais l'histoire de renommer les fichiers selon les tags, de régler les tags sur des groupes de fichiers, etc... tout ça, ça devrait être ok.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#18 Le 20/01/2016, à 16:21
- nany
Re : [RESOLU] Attribution de variable avec un for
Oui, Easytag permet déjà pas mal de choses.
Maintenant, s’il s’agit de t’aguerrir à la réalisation de scripts (après tout, on a bien de le droit de s’entraîner en réinventant la roue pourvu que cette nouvelle roue ne soit pas trop voilée), je veux bien t’aider, moi aussi.
Dans ce but, voici mes premières remarques :
l’indentation, c’est bien ; exemple d’indentation qui rend le code plus lisible ;
for <blabla> do <blabla> if <blabla>; then <blabla> else <blabla> fi <blabla> done
echo 'Dossier (chemin absolue) ?' read Dossier
afin d’éviter d’éventuelles erreurs, je proposerais plutôt une interface graphique ;
Dossier=$(zenity --file-selection --directory --filename="$HOME" 2>/dev/null) (( $? )) && exit 1
je ne comprends pas cette partie ;
for fileA in `(ls)`;do ## parcourir un ls avec des espaces. echo "$fileA" cd "$fileA"
qu’est censé représenter $fileA ?
Cette liste est non exhaustive mais j’attends d’abord des éclaircissement sur le dernier point pour donner des suites.
En effet, je ne connais pas ton organisation donc la structure de tes répertoires, d’où ce questionnement sur la représentation de $fileA.
Dernière modification par nany (Le 20/01/2016, à 19:31)
Hors ligne
#19 Le 20/01/2016, à 18:16
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
for fileA in `(ls)`;do ## parcourir un ls avec des espaces.
echo "$fileA"
cd "$fileA"
Cela permet de parcourir tout les dossiers présent dans le chemin saisie, comme ça je peut traiter plusieurs albums à la fois .
En gros,
echo 'Dossier (chemin absolue) ?'
read Dossier
, l'utilisateur saisie un dossier ou il y a plusieurs sous-dossiers qui chacun comprennent:
1/ tout les morceaux d'un albums en flac
2/ un fichier .info avec les informations de l'album
3/ l'illustration de l'album en .jpg
PS : Pour la partie de saisie du dossier, j'ai effectuer le remplacement par "Dossier=...." et c'est juste GENIAL Merci Beaucoup
EasyTAG : Je viens de re-essayer Easytag, et je n'arrive toujours pas à traiter des fichiers en groupe, en format ".flac" (Je cherche à ajouter une illustration à tout les morceaux d'un album d'un coup).
#20 Le 20/01/2016, à 18:25
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
EasyTAG : Je viens de re-essayer Easytag, et je n'arrive toujours pas à traiter des fichiers en groupe, en format ".flac" (Je cherche à ajouter une illustration à tout les morceaux d'un album d'un coup).
Tu vas dans le répertoire de l'album, tu sélectionne tous les fichiers (avec Ctrl-A par exemple), tu choisis ton image dans l'onglet "Images" puis tu cliques sur la dernière icône en-dessous, une image avec une flèche orange vers le bas, « Étiquette les fichiers sélectionnés avec ces images ».
Puis il n'y a plus qu'à enregistrer.
Pareil pour les champs textuels, tu sélectionne tous les fichiers concernés, tu tapes le truc que tu veux dans le champ que tu veux, puis tu cliques sur le petit "Abc" à côté avec une flèche orange vers le bas.
Dernière modification par tiramiseb (Le 20/01/2016, à 18:26)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#21 Le 20/01/2016, à 18:27
- tiramiseb
Re : [RESOLU] Attribution de variable avec un for
for fileA in `(ls)`;do ## parcourir un ls avec des espaces.
a priori tu peux le remplacer par :
for fileA in *
do
(en passant, je te conseille en effet d'éviter les points virgules mais plutôt de mettre le "do" à la ligne)
Dernière modification par tiramiseb (Le 20/01/2016, à 18:27)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#22 Le 20/01/2016, à 20:20
- Morrisson
Re : [RESOLU] Attribution de variable avec un for
Bon voilà, EasyTag permet de tagger les fichiers flac par groupes c'est à dire ce que je souhaitai faire. Ainsi je cloture ce sujet, (qui j'espère vous à était éducatif ).
Un grand merci à la communauté, vous ^etes tout simplement GENIAL.
PS : je laisse à disposition le code que j'ai fais ( en espérant qu'il sera utile à quelqu'un ).:lol:
#!/bin/bash
#information#
#colors
VERT="\\033[1;32m"
NORMAL="\\033[0;39m"
ROUGE="\\033[1;31m"
ROSE="\\033[1;35m"
BLEU="\\033[1;34m"
BLANC="\\033[0;02m"
BLANCLAIR="\\033[1;08m"
JAUNE="\\033[1;33m"
CYAN="\\033[1;36m"
#To ask the directory where the user wants to execute the script
echo 'Directory (absolute way) ?'
#Dossier=$(zenity --file-selection --directory --filename="$HOME" 2>/dev/null)
(( $? )) && exit 1
#read Dossier
#cd "$directory"
cd ZoneTest/ #remove
#vérifier les dossiers
###CHECK the folders and files
#vérifier que les fichiers cont bien numéroté de 1 à n
echo -e $CYAN"Check :"$NORMAL
OLDIFS=$IFS;
IFS=$(echo -en "\n\b" );
for fileA in `(ls)`;do
echo -e $BLEU"-----"$fileA"-----"$NORMAL
cd $fileA
let "var11 = 1"
while [[ $var11 -ne 0 ]]; do
let "var11 = 0"
for h in 'info' 'jpg' ; do
var10=`find . -maxdepth 1 -name "*.$h" | wc -l`
echo -n "file .$h.........."
if [ $var10 -ne 1 ]; then
echo -n -e $ROUGE"NO"$NORMAL
let "var11 = $var11 + 1"
if [ $var10 -ge 1 ]; then
echo " ( I have find few $h's files: $var10 )"
if [ $h = 'info' ]; then
let "var11 = $var11 + 1"
fi
else
echo " ( No file $h here )";
fi
else
echo -e $VERT"OK"$NORMAL
fi
done
if [ $var11 -le 1 ]; then
echo -n "file .flac.........."
var1Nfil=`find . -maxdepth 1 -name "*.flac" | wc -l`
var1Ninf=`sed -n 5p *.info | cut -d = -f 2`
if [ $var1Nfil -ne $var1Ninf ]; then
echo -n -e $ROUGE"NO"$NORMAL
let "var11 = $var11 + 1"
if [ $var1Nfil -lt $var1Ninf ]; then
let "var12 = $var1Ninf - $var1Nfil"
echo " (Il manque $var12 morceaux. )"
elif [ $var1Nfil -gt $var1Ninf ]; then
let "var12 = $var1Nfil - $var1Ninf"
echo " (Il y a $var12 morceaux en plus.)"
fi
else
echo -e $VERT"OK"$NORMAL
fi
fi
if [ $var11 -ne 0 ]; then
read stop
fi
done
cd ../
IFS=$OLDIFS;
done
echo -e "\n***END of CHECKING***\n"
#récperer les donnée
var1=`find . -maxdepth 1 -name "*.info"`
ninfo=`echo "$var1" | cut -c 3-`
echo $ninfo
echo '-----*-----'
#'$album' '$year' '$genre' '$numbertracks'
let "var2 = 0"
for i in 'artist' ; do
let "var2 = var2+1 "
echo -n "$i :"
var3=`sed -n "$var2"p *.info | cut -d = -f 2`
echo $var3
echo $var3 | read $i #We don't need no more troubles
done
echo $artist