1 votes

Scripting et cotation Bash

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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X