Il est recommandé, dans les scripts bash, de ne pas analyser le résultat de ls
La page Web liée à ci-dessus recommande un code tel que:
# Good!
for f in *; do
[[ -e $f ]] || continue
...
done
ou pour remplir un tableau avec des noms de fichiers
myfiles=( ~/* )
Mais lorsque je regarde ces exemples et que je sais comment les coquilles traitent les chaînes non citées en général, j’ai l’impression que si j’utilisais ce code sur des noms de fichiers contenant des espaces, le glob exploserait tous les mots séparés par des espaces dans les fichiers. Par exemple, si j'ai le répertoire suivant
$ ls -1
a file I downloaded from the net.pdf
apple.sh
hello world.txt
et je lance cette
for file in *
do printf "%s\n" "$file"
done
J'attends un comportement de chaîne non entre guillemets. par exemple
a
file
I
downloaded
from
the
net.pdf
apple
hello
world
Mais ce que je reçois, c'est le comportement correct
a file I downloaded from the net.pdf
apple
hello world
similaire pour les tableaux
myfiles=( * )
declare -p myfiles
declare -a myfiles='([0]="a file I downloaded from the net.pdf" [1]="apple" [2]="hello world")'
Ma question est pourquoi est-ce?
Est-ce parce que l'expansion globale est faite après la séparation des mots? (afin que ces types d'opérations sur les fichiers produisent une sortie correcte?)
[ -e $f ]
on utilisait, on séparerait les mots, non? Aussi, je pense que dans le[[ ]]
contexte, le*
caractère ne signifie pas les noms de fichiers du répertoire actuel, cela signifie "correspondance de modèle de chaîne"? par exempleif [[ $interface == wlp* ]]; then ...
[
fait partie d'une ligne de commande normale avec les règles d'expansion normales.