Je lisais ce fil: Comment faire une boucle sur les lignes d'un fichier?
Qu'est-ce que c'est IFS
? Et quelle est son utilisation dans le contexte de for
-loops?
Je lisais ce fil: Comment faire une boucle sur les lignes d'un fichier?
Qu'est-ce que c'est IFS
? Et quelle est son utilisation dans le contexte de for
-loops?
IFS
représente - c'est un caractère qui sépare les champs. Dans l'exemple que vous avez publié, il est défini sur un nouveau caractère de ligne ( ); donc après l'avoir défini, traitera le texte ligne par ligne. Dans cet exemple, vous pouvez modifier la valeur de (en une lettre que vous avez dans votre fichier d'entrée) et vérifier comment le texte sera divisé.Input
Internal Field Separator
\n
for
IFS
BTW, d'après la réponse que vous avez publiée, la deuxième solution est celle recommandée ...
Comme @jasonwryan remarqué, ce n'est pas Input
mais Internal
. Le nom Input
vient d' awk
où il y a aussi OFS
- Output Field Separator
.
S
était pour separator dans le shell Bourne d'où il provenait. Dans le shell Korn et la plupart des autres shell de type Bourne comme cela a été spécifié parPOSIX
, leS
est pour le délimiteur (étirez un peu votre imagination) carA::B:
par exemple est divisé en "A", "" et "B" (sans supplément ""). C'est différent deawk
'sFS
ou dus
drapeau d'expansion des paramètres dezsh
.IFS
n'est pas directement lié au bouclage, il est lié au fractionnement de mots.IFS
détermine indirectement comment la sortie de la commande est divisée en morceaux sur lesquels la boucle itère.Lorsque vous avez une substitution de variable non protégée
$foo
ou une substitution de commande$(foo)
, il y a deux cas:"$foo"
, ou dans une affectation de variablex=$foo
, la chaîne résultant de la substitution est utilisée telle quelle.$IFS
est considéré comme un séparateur de mots. Par exemple,IFS=":"; foo="12:34::78"; echo $foo
imprime12 34 78
(avec deux espaces entre34
et78
, car il y a un mot vide).foo="*"; echo $foo
imprime la liste des fichiers dans le répertoire courant.Pour les boucles, comme beaucoup d'autres contextes, attendez-vous à une liste de mots. Donc
se décompose
$(foo)
en mots et traite chaque mot comme un motif global. La valeur par défaut deIFS
est espace, tabulation et nouvelle ligne , donc sifoo
imprime deux ligneshello world
et quehowdy
le corps de la boucle est exécuté avecx=hello
, puisx=world
etx=howdy
. SiIFS
est explicitement modifié pour ne contenir qu'une nouvelle ligne, la boucle est exécutée pourhello world
ethowdy
. SiIFS
est changé pour êtreo
, alors la boucle est exécutée pourhell
, w
,rldh
(où
est un caractère de saut de ligne) etwdy
.la source
"IFS indirectly determines how ..."
?IFS
(directement) détermine comment la sortie de la substitution de commande est décomposée, ce qui détermine ensuite (indirectement) ce que la boucle boucle.De
man bash
C'est l'une des variables internes de Bash. Il détermine comment Bash reconnaît les champs ou les limites des mots lorsqu'il interprète les chaînes de caractères.
Par défaut, il s'agit d'espaces (espace, tabulation et nouvelle ligne), mais il peut être modifié, par exemple, pour analyser un fichier de données séparé par des virgules.
http://tldp.org/LDP/abs/html/internalvariables.html
la source
En plus des excellentes réponses précédentes, permettez-moi d'ajouter que IFS est très utile pour une analyse efficace et portable dans des cas simples en combinaison avec set . Efficace, car évite d'utiliser des sous-coquilles et des outils de frai comme grep ou sed:
Notez simplement que nous devons stocker et récupérer la valeur précédente d' IFS pour éviter les ruptures indésirables dans d'autres parties du script.
la source