Vous n'êtes pas identifié(e).
j'essaye donc dans mon script sans y croire et la mon fichier dont le nom comporte un espace n'est plus diviser en 2 et ne prend qu'une seul cellule du tableau! le résultat es-conté
Du coup quelqu'un pourrait m'en dire plus ?
D’où ça sort ?
Il y en as d'autre des comme ça à connaitre?
En vous remerciant.
Dernière modification par VBrice (26-04-2022 18:38:36)
Hors ligne
Edit
Par contre :
Cela vient de comment bash développe les mots.
Quand on utilise l'indice @ pour un tableau cela signifie tous les indices et est développé en 1 mot par élément, contrairement à l'indice * qui de même indique tous les indices mais est développé en 1 seul mot pour tous les éléments.
Mais pour que ça fonctionne bien, il faut protéger les appels des tableaux par des guillemets.
En gros, dans la 1ère boucle, la variable "${tab[@]}" est développée ainsi : "fich espace" "fichsansespace"
Tandis que dans la 2ième, la variable ${tab[@]} est développée ainsi : fich espace fichsansespace
D'où les 2 résultats différents.
Dernière modification par Tawal (25-04-2022 22:49:34)
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
En ligne
si le nom du fichier comporté un espace, il été considéré comme 2 fichiers distinct
Normal, par défaut le shell considère l'espace comme un séparateur.
Il faut "échapper" les espaces en les faisant précéder par \ ou en entourant les noms de fichiers avec des guillemets simples ou doubles. Comment le script récupère-t-il la liste des fichiers ?
IFS=$'\n'
IFS = Input Field Separator = la liste des caractères considérés comme séparateurs. Par défaut (vide), espace, tabulation et saut de ligne.
$'\n' = caractère saut de ligne (LF). Attention : c'est un "bashisme", une extension propre à bash qui ne fait pas partie des spécifications POSIX. Le shell par défaut /bin/sh (dash) ne connaît pas cette syntaxe.
man bash
man sh
En redéfinissant IFS comme seulement le saut de ligne, l'espace n'est plus considéré comme un séparateur. Mais cela risque d'avoir d'autres effets indésirables. Il vaudrait mieux échapper les noms de fichiers.
Il vaut mieux montrer que raconter.
Hors ligne
Après j'ai un
mais j'ai toujours le nom du fichier coupé
Et avec un
si j'ai pas de fichier png dans le dossier il m'ajoute une entré '*.png'
Je pensé avoir trouver avec :
Malheureusement "${ArrayFull[0]}" comporte tous les noms de fichier
C'est à ce niveau la que ça coince: ArrayFull=($(find *.png *.bmp *.jpg)); j'ai donc procéder autrement : j'ai créer un tableau de tous les fichier avec ArrayFull=(*) puis dans ce tableau si un item comporte une extention de fichier image je l'ajoute dans un second tableau. Puis j'utilise ce second tableau pour faire la convertion
Dernière modification par VBrice (26-04-2022 17:59:14)
Hors ligne
jusque la, le point négatif de ce code est le filtrage des extensions de fichier: en effet vu que Linux est sensible à la casse, .png sera diffèrent de . PNG ou .pNg ...
Je me pencherais sur les regex quand je serais plus à l’aise avec bash
Merci encore
Hors ligne
Salut
"blues are the roots and the other musics are the fruits" . Willie Dixon
Hors ligne
Dernière modification par Tawal (26-04-2022 21:22:19)
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
En ligne
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
En ligne
J'ai l'impression que toute la liste des fichiers est contenu dans la 1ere cellule du tableau:
un echo "${t[0]}" renvoie toute la liste affiché, et un echo "${t[1]}" ne renvoie rien.
Théoriquement, si je suis l'ordre de ta liste,
echo "${t[0]}" devrais renvoyer DossTest/t t2.txt
echo "${t[1]}" devrais renvoyer DossTest/t3.txt
echo "${t[2]}" devrais renvoyer DossTest/t t3.txt
Je dirais donc que actuellement "${t[@]}" est un tableau à une case ?
J'ai peut être loupé un truc?
Dernière modification par VBrice (26-04-2022 22:30:36)
Hors ligne
Désolé
Edit:
Tu devrais (comme moi) utiliser shellcheck qui indique les "erreurs" et les "conventions" usuelles d'un script.
Exemple :
Le script :
Le test shellcheck :
Dernière modification par Tawal (26-04-2022 23:42:59)
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
En ligne
Hors ligne
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
En ligne
Hors ligne