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
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.
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
...
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.
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
si tu ne corriges pas les erreurs que je t'ai indiquées...
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
[[ 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 ?
ç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 
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.
ç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"
 
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
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
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. 🙂
ç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
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.
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
parce que echo n'utilise pas de format (%s)

montre-nous ton script actuel, et son résultat dans le terminal
!/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
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