Je suis en train de lire quelques livres sur les scripts bash, et j'ai du mal à comprendre les citations correctes et l'utilisation des éléments suivants IFS
. Peut-être que quelqu'un peut m'aider avec un petit exemple impliquant des noms de fichiers avec des guillemets. En faisant cela à partir d'une ligne de commande, cela fonctionne pour imprimer les noms de fichiers correctement, même s'ils incluent des espaces :
set - *
for i in "$@"; do echo $i; done
Cela ne fonctionne pas, car il s'interrompt au niveau des espaces :
set - `find . -name "*"`
for i in "$@"; do echo $i; done
Ni l'un ni l'autre :
IFS=$'\0' set - `find . -name "*" -print0`
for i in "$@"; do echo $i; done
Pas plus que la combinaison qui utilise IFS=$'\n'
y -print
. Pourquoi ces derniers échouent-ils tous ?
La commande suivante échoue également, mais dans ce cas, elle se trompe ("bash : syntax error near unexpected token `do'"). Pourquoi ?
IFS=$'\n' for i in `find . -name "*" -type f`; do echo $i; done
mais ceci fonctionne (remarquez le " ;") :
IFS=$'\n'; for i in `find . -name "*" -type f`; do echo $i; done
et cela échoue parce que les noms de fichiers ne sont pas du tout séparés (la balise for
une seule fois) :
IFS=''; for i in `find . -name "*" -type f -print0`; do echo -e "$i\n"; done
Alors encore une fois, pourquoi le premier et le troisième échouent-ils ?
Enfin, ai-je raison de penser que lorsque l'on met en place IFS
, ''
est la même chose que $'\0'
? (J'ai essayé les deux dans l'exemple précédent.) Si c'est le cas, pourquoi ai-je apparemment besoin de $'\n'
plutôt que juste \n
?
*Bash est la version 4.3.42(1) dans Ubuntu Gnome 16.04.