GNU/Linux >> Tutoriels Linux >  >> Linux

Comprendre les Si ?

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 :

  1. Oui, ce sont les mêmes.
  2. Oui.
  3. 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'ancien IFS valeur, puis restaurez-la par la suite (ou remplacez-la temporairement pour une commande en utilisant la commande var=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).
En relation :Comprendre "IFS =read -r line" ?
Linux
  1. Comprendre systemd au démarrage sous Linux

  2. Comprendre "ifs=Lire -r Ligne" ?

  3. Dans `while Ifs=Read..`, Pourquoi Ifs n'a-t-il aucun effet ?

  4. Comprendre les actions rsyslog

  5. Comprendre les mappages de ports Docker

Ansible vs Kubernetes :comprendre les différences

Comprendre les autorisations de fichiers Linux

Commande de lecture bash

Comment lire un fichier ligne par ligne dans Bash

Lire le courrier de l'utilisateur

Comprendre les processus sous Linux