Les quelques discussions suivantes sur ce site et StackOverflow ont été utiles pour comprendre comment IFS
fonctionne :
- Qu'est-ce qu'IFS dans le contexte d'une boucle for ?
- Comment boucler sur les lignes d'un fichier
- Bash, lecture ligne par ligne du fichier, avec IFS
Mais j'ai encore quelques petites questions. J'ai décidé de les poser dans le même article car je pense que cela pourrait aider de meilleurs futurs lecteurs :
Q1. IFS
est généralement discuté dans le contexte de la « division de champ ». Est-ce que le fractionnement des champs identique à la séparation de mots ?
T2 : La spécification POSIX indique :
Si la valeur d'IFS est nulle, aucun fractionnement de champ ne sera effectué.
Définit IFS=
identique à la définition de IFS
à nul ? Est-ce ce que l'on entend par le définir sur une empty string
aussi ?
Q3 : Dans la spécification POSIX, je lis ce qui suit :
Si IFS n'est pas défini, le shell doit se comporter comme si la valeur d'IFS était
<space>, <tab> and <newline>
Supposons que je souhaite restaurer la valeur par défaut de IFS
. Comment je fais ça? (plus précisément, comment puis-je faire référence à <tab>
et <newline>
?)
Q4 : Enfin, comment ce code :
while IFS= read -r line
do
echo $line
done < /path_to_text_file
se comporter si nous changeons la première ligne en
while read -r line # Use the default IFS value
ou à :
while IFS=' ' read -r line
Réponse acceptée :
- Oui, ce sont les mêmes.
- Oui.
- Dans bash et autres shells similaires, vous pouvez faire quelque chose comme
IFS=$' tn'
. Sinon, vous pouvez insérer les codes de contrôle littéraux en utilisant[space] CTRL+V [tab] CTRL+V [enter]
. Si vous envisagez de le faire, il est préférable d'utiliser une autre variable pour stocker temporairement l'ancienIFS
valeur, puis restaurez-la par la suite (ou remplacez-la temporairement pour une commande en utilisant la commandevar=foo command
syntaxe). - Le premier extrait de code mettra la ligne entière lue, textuellement, dans
$line
, car il n'y a pas de séparateurs de champs pour lesquels effectuer le fractionnement de mots. Gardez cependant à l'esprit que, puisque de nombreux shells utilisent des cstrings pour stocker des chaînes, la première instance d'un NUL peut toujours donner l'impression qu'il se termine prématurément. - Le deuxième extrait de code peut ne pas mettre une copie exacte de l'entrée dans
$line
. Par exemple, s'il y a plusieurs séparateurs de champs consécutifs, ils seront transformés en une seule instance du premier élément. Ceci est souvent reconnu comme une perte d'espace blanc environnant. - Le troisième extrait de code fera la même chose que le second, sauf qu'il ne sera divisé que sur un espace (pas l'espace, la tabulation ou le retour à la ligne habituels).
- Le premier extrait de code mettra la ligne entière lue, textuellement, dans