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 19/01/2016, à 23: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" big_smile

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é lol .

Dernière modification par Morrisson (Le 20/01/2016, à 21:46)

#2 Le 19/01/2016, à 23: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
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, à 10: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 wink

Dernière modification par tiramiseb (Le 20/01/2016, à 10:01)

Hors ligne

#4 Le 20/01/2016, à 11:31

Morrisson

Re : [RESOLU] Attribution de variable avec un for

Bonjour et merci d'avoir répondu, c'est vraiment cool. smile
Par contre, les solutions proposées ne fonctionnent pas hmm . 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 big_smile

Dernière modification par Morrisson (Le 20/01/2016, à 11:33)

#5 Le 20/01/2016, à 11: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, à 11:49)

Hors ligne

#6 Le 20/01/2016, à 12: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, à 12: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, à 12:32)

Hors ligne

#8 Le 20/01/2016, à 12:29

nany

Re : [RESOLU] Attribution de variable avec un for

Bonjour,

tiramiseb a écrit :

montre ton script

tiramiseb a écrit :

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, à 12: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, à 12: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 ?

Hors ligne

#11 Le 20/01/2016, à 12: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, à 12: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 ? smile

Hors ligne

#13 Le 20/01/2016, à 13: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. wink

Hors ligne

#14 Le 20/01/2016, à 14:17

Morrisson

Re : [RESOLU] Attribution de variable avec un for

Présentation générale du script : smile
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 big_smile

#15 Le 20/01/2016, à 14: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 ? smile

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...

Hors ligne

#16 Le 20/01/2016, à 14:45

Morrisson

Re : [RESOLU] Attribution de variable avec un for

Oui Easytag fait tous ça mais il faut faire les fichiers un par un big_smile 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, à 14: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.

Hors ligne

#18 Le 20/01/2016, à 17: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, à 20:31)

Hors ligne

#19 Le 20/01/2016, à 19: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 smile .
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 smile

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, à 19: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, à 19:26)

Hors ligne

#21 Le 20/01/2016, à 19: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, à 19:27)

Hors ligne

#22 Le 20/01/2016, à 21: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 big_smile ).
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