IFS
Egy korábbi bejegyzésben mutattam egy scriptet, ami fájlokat nevez át kisbetűssé:
for i in *.JPG; do mv $i `echo $i | tr A-Z a-z`; done
Ha a scriptet lefuttatjuk egy alkönyvtárban, melyben a következő 2 jpg fájl található:
A.JPG
B C.JPG
akkor sajnos hibaüzenetet kapunk:
mv: target `c.jpg' is not a directory
A hibaüzenetből rájöhetünk, hogy a problémát a második fájl nevében található szóköz karakter okozza ( személy szerint én mindig próbálom elkerülni a szóköz használatát a fájlnevekben). Az IFS (Internal Field Separator) környezeti változó alapján dönti el a bash, hogy milyen karaktereket tekintsen szeparáló karakternek. Mivel alapértelmezés szerint a szóköz is szeparáló karakter, ezért rossz helyen “törik el” a parancsunk. Először is nézzük meg, mi az IFS környezeti változó alapértelmezése! Ha a szokásos módon
echo
paranccsal iratjuk ki a tartalmát, akkor nem leszünk okosabbak:
[gep]$ echo $IFS
[gep]$
Mivel IFS alapértelmezésben speciális karaktereket tartalmaz ( szóköz, tab, újsor ), nem látunk semmit. Ehelyett inkább a következő módon nézzük meg a változó tartalmát:
[gep]$ printf "%q\n" "$IFS"
$' \t\n'
[gep]$
Ha módosítjuk IFS értékét, hogy a szóközt ne tartalmazza:
IFS=$'\t\n'
, akkor már rendben lefut a scriptünk.