GNU/Linux >> Znalost Linux >  >> Linux

Rozumět Ifs?

Následujících několik vláken na tomto webu a StackOverflow pomohlo pochopit, jak IFS funguje:

  • Co je IFS v kontextu smyčkování for?
  • Jak procházet řádky souboru
  • Bash, číst řádek po řádku ze souboru pomocí IFS

Ale ještě mám pár krátkých otázek. Rozhodl jsem se jich zeptat ve stejném příspěvku, protože si myslím, že to může pomoci lepším budoucím čtenářům:

O1. IFS je typicky diskutováno v kontextu „rozdělování polí“. Je rozdělení polí stejné jako rozdělování slov ?

O2: Specifikace POSIX říká:

Pokud je hodnota IFS nulová, nebude provedeno žádné dělení pole.

Je nastavení IFS= stejné jako nastavení IFS vynulovat? Je toto myšleno nastavením na empty string taky?

O3: Ve specifikaci POSIX jsem četl následující:

Pokud není IFS nastaveno, shell se bude chovat, jako kdyby hodnota IFS byla
<space>, <tab> and <newline>

Řekněme, že chci obnovit výchozí hodnotu IFS . Jak to udělám? (konkrétněji, jak mám odkazovat na <tab> a <newline> ?)

O4: Nakonec, jak by tento kód:

while IFS= read -r line
do    
    echo $line
done < /path_to_text_file

chovat se, pokud změníme první řádek na

while read -r line # Use the default IFS value

nebo na:

while IFS=' ' read -r line

Přijatá odpověď:

  1. Ano, jsou stejné.
  2. Ano.
  3. V bash a podobných shellech můžete udělat něco jako IFS=$' tn' . Jinak byste mohli vložit doslovné řídicí kódy pomocí [space] CTRL+V [tab] CTRL+V [enter] . Pokud to však plánujete udělat, je lepší použít jinou proměnnou k dočasnému uložení starého IFS hodnotu a poté ji obnovte (nebo ji dočasně přepište pro jeden příkaz pomocí var=foo command syntaxe).
    • První fragment kódu vloží celý přečtený řádek, doslovně, do $line , protože neexistují žádné oddělovače polí, pro které by bylo možné provádět dělení slov. Mějte však na paměti, že vzhledem k tomu, že mnoho shellů používá k ukládání řetězců cstring, první výskyt NUL může stále způsobit zdání, že je předčasně ukončen.
    • Druhý úryvek kódu nemusí obsahovat přesnou kopii vstupu do $line . Pokud například existuje více po sobě jdoucích oddělovačů polí, vytvoří se z nich jedna instance prvního prvku. To je často rozpoznáno jako ztráta okolního bílého prostoru.
    • Třetí fragment kódu bude fungovat stejně jako druhý, s tím rozdílem, že se rozdělí pouze na mezeru (nikoli na obvyklou mezeru, tabulátor nebo nový řádek).
Související:Rozumíte „IFS=read -r line“?
Linux
  1. Jak číst IP adresu pozpátku?

  2. Rozumíte Linux Desktopu?

  3. Pochopení nástroje logrotate

  1. Pochopení akcí rsyslog

  2. linuxová schránka pro čtení/zápis v C

  3. tar:krátké čtení

  1. Pochopení systemd při startu na Linuxu

  2. Rozumíte „ifs=Read -r Line“?

  3. „Kdyby“?