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 08/05/2020, à 17:35

joe217

[résolu] commande printf

Bonjour,

j'aimerais afficher uniquement les fichiers de mon répertoire courant ;

#!/bin/zsh

for filename in "$(ls)"

if [[ -f filename ]] ; then
cat $filename | while read ligne ; do; 
    
    printf  "Les fichiers présents dans le répertoire courant sont%s" "$ligne"
   fi
done

je ne comprends pas pourquoi il m'affiche 1 pare error near \n?
merci

Dernière modification par joe217 (Le 09/05/2020, à 18:06)

Hors ligne

#2 Le 08/05/2020, à 18:52

Watael

Re : [résolu] commande printf

salut,

for filename in "$(ls)" Non.

for filename in *

if [[ -f filename ]] ; then Non. tu n'utlises pas les fonctionnalités avancées des crochets doubles, donc utilise plutôt un test simple.
et il faut développer la variable

if test -f "$filename"

cat $filename Non. on n'utilise pas cat dans ce cas, on redirige le contenu du fichier vers la sortie standard pour read

while read line; do :...; done <"$filename"

et il faut ajouter un retour chariot au fromat passé à printf.

ET, il faut toujours mettre les Développements de paramètres entre guillemets.


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

Hors ligne

#3 Le 08/05/2020, à 22:25

joe217

Re : [résolu] commande printf

merci j'ai corrigé mais j'ai toujours des erreurs:parse error near fi

#!/bin/zsh

for filename in *

if test -f "$filename"
while read ligne ; do; 
    
    printf  "Les fichiers présents dans le répertoire courant sont%s" "$ligne"
   fi
done <"$filename" 

pour printf je veux juste qu'il me liste sous cette forme;
Les fichiers présents dans le répertoire courant sont
fichier1.txt
fichier2.txt
...

Dernière modification par joe217 (Le 08/05/2020, à 22:26)

Hors ligne

#4 Le 09/05/2020, à 07:11

Watael

Re : [résolu] commande printf

j'ai toujours des erreurs:parse error near fi

il manque le then.

$ help if
if: if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi

et le fi doit être après le done du while
il y a d'ailleurs un point-virgule de trop après do

et il manque le done du for.


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

Hors ligne

#5 Le 09/05/2020, à 14:50

joe217

Re : [résolu] commande printf

merci mais j'ai toujours des erreurs

#!/bin/zsh

for filename in *

if test -f "$filename" ; then 
while read ligne ;  do; 
    
echo -n  $ligne
fi
done < "$filename" 

j'ai toujours un parse error near fi et la syntaxe est correcte; il doit avoir un ; apres le do..
comment on fais avec le printf pour afficher chaque nom a la ligne ;
je sais que c'est printf "$ligne " mais pour afficher avant de lister les fichiers ; il faut faire ;
printf  "Les fichiers présents dans le répertoire courant sont%s" "$ligne"
?
merci

Hors ligne

#6 Le 09/05/2020, à 14:54

Watael

Re : [résolu] commande printf

si tu ne corriges pas les erreurs que je t'ai indiquées...

Dernière modification par Watael (Le 09/05/2020, à 15:19)


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

Hors ligne

#7 Le 09/05/2020, à 15:04

joe217

Re : [résolu] commande printf

J'ai mis le fi aprés le done et j'ai toujours l'erreur
et j'ai  pas besoin de rajouter un 2e done pour le for
et dans mon cours ; Pour tester si un fichier est ordinaire, on utilise [[ -f nom_du_fichier ]]
donc je peux utiliser ça

Dernière modification par joe217 (Le 09/05/2020, à 15:10)

Hors ligne

#8 Le 09/05/2020, à 15:23

Watael

Re : [résolu] commande printf

[[ est inutile si tu n'en utilises pas les fonctionnalités avancées, mais -f est la bonne option.

pour les erreurs :
il y a toujours un point-virgule en trop après do
il manque toujours le done du for

[edit :

et j'ai  pas besoin de rajouter un 2e done pour le for

ah bon. et pourquoi ?

Dernière modification par Watael (Le 09/05/2020, à 15:24)


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

Hors ligne

#9 Le 09/05/2020, à 15:41

joe217

Re : [résolu] commande printf

ça marche toujours pas :parse error near fi

#!/bin/zsh

for filename in *

if test -f "$filename" ; then 
while read ligne ;  do
    
echo -n  $ligne
fi
done < "$filename"
done 

Hors ligne

#10 Le 09/05/2020, à 15:51

Watael

Re : [résolu] commande printf

le fi est toujours avant le premier done, alors qu'il doit être après.

si tu indentais ton code tu le verrais.

ah ! et il manque un do pour le for.


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

Hors ligne

#11 Le 09/05/2020, à 16:06

joe217

Re : [résolu] commande printf

ça marche toujours pas ?

#!/bin/zsh

for filename in *; do

if test -f "$filename" ; then 
while read ligne ;  do
    
echo -n  $ligne

done
fi
done < "$filename"
 

Hors ligne

#12 Le 09/05/2020, à 16:09

Watael

Re : [résolu] commande printf

c'est le read dans la boucle while qui doit lire le fichier.
en gros, c'est la boucle while qui doit lire le fichier pas la boucle for

Dernière modification par Watael (Le 09/05/2020, à 16:10)


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

Hors ligne

#13 Le 09/05/2020, à 17:32

joe217

Re : [résolu] commande printf

j'ai pas compris j'ai fais ça et çca marche:

#!/bin/zsh

for filename in *
do
if [[ -f $filename ]]
then
echo "$filename"
fi
done

mais je veux que ma premiere ligne soit les fichiers du repertoire courant sont
j'ai fais ça avec printf:
printf "les fichiers du repertoire courant sont%s" "$filename"
mais ça m'affiche cette phrase avant chaque fichier et non qu'une seule fois au début ???
merci

Hors ligne

#14 Le 09/05/2020, à 17:37

Watael

Re : [résolu] commande printf

il ne faut pas mettre le printf dans la boucle.
d'ailleurs, alors, puisque printf ne formate aucunes données, il est inutile - utilise simplement echo; mais avant la boucle. smile

Dernière modification par Watael (Le 09/05/2020, à 17:38)


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

Hors ligne

#15 Le 09/05/2020, à 17:42

joe217

Re : [résolu] commande printf

ça ne marche pas avec le echo

echo "les fichiers du repertoire courant sont%s" "$filename"

et je peux pas mettre le printf apres la boucle sinon la boucle est vide ??

aussi je dois utiliser printf

Dernière modification par joe217 (Le 09/05/2020, à 17:43)

Hors ligne

#16 Le 09/05/2020, à 17:47

Watael

Re : [résolu] commande printf

je n'ai peut-être pas compris, mais tu veux

les fichiers du répertoire courant sont : #là, on n'est pas dans la boucle
fic1 # là on est entrés dans la boucle
fic2
ficN+1 # dernier fichier - là on sort de la boucle

donc tu veux simplement afficher une chaîne fixe : "les fichiers...sont".
il n'y a pas de formatage à appliquer, pas de données "dynamiques" : printf est inutile.

Dernière modification par Watael (Le 09/05/2020, à 17:48)


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

Hors ligne

#17 Le 09/05/2020, à 17:48

joe217

Re : [résolu] commande printf

oui c'est exactement ça mais avec echo ça marche pas

echo "les fichiers du rep courant sont\n" "$filename"

avec ça j'ai
les fichier du rep
fic1
les fichier du rep
fic 2

Dernière modification par joe217 (Le 09/05/2020, à 17:50)

Hors ligne

#18 Le 09/05/2020, à 17:50

Watael

Re : [résolu] commande printf

parce que echo n'utilise pas de format (%s)

montre-nous ton script actuel, et son résultat dans le terminal


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

Hors ligne

#19 Le 09/05/2020, à 17:53

joe217

Re : [résolu] commande printf

!/bin/zsh

for filename in *
do
if [[ -f $filename ]]
then
echo "les fichiers du rep courant sont\n" "$filename"
fi
done

résultat
les fichiers du rep courant sont
fic1
les fichiers du rep courant sont
fic2
les fichiers du rep courant sont
fic3

Hors ligne

#20 Le 09/05/2020, à 17:58

Watael

Re : [résolu] commande printf

il faut un echo avant la boucle, et un autre echo dans la boucle

echo 'les fichiers du répertoire courant sont :'
for f in *
do
    test -f "$f" && echo "$f"
done

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

Hors ligne

#21 Le 09/05/2020, à 18:05

joe217

Re : [résolu] commande printf

merci bcp

Hors ligne