๐ง IFS(Internal Field Separator) ์๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌ
BASH IFS
IFS๋ Internal Field Separator์ ์ฝ์๋ก ์ธ๋ถํ๋ก๊ทธ๋จ์ ์คํํ ๋ ์ ๋ ฅ๋๋ ๋ฌธ์์ด์ ๋๋ ๋ ๊ธฐ์ค์ด ๋๋ ๋ฌธ์๋ฅผ ์ ์ํ๋ ํ๊ฒฝ ๋ณ์์ด๋ค. ํฐ๋ฏธ๋์์ ํ๊ฒฝ๋ณ์๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ๊ณต๋ฐฑ๋ฌธ์๊ฐ ์ถ๋ ฅ ๋จ์ ๋ณผ ์ ์๋ค.
IFS๋ ๋ํดํธ ๊ฐ์ ๊ณต๋ฐฑ/ํญ/๊ฐํ ๋ฌธ์๋ค. (space, tab, new line)
์ ์คํฌ๋ฆฝํธ์์ for in ๋ฌธ๋ฒ์ ๋ณด๋ฉด, ๊ณต๋ฐฑ๋ฌธ์๋ก ๋์์ง ํ๋์ ๋ฌธ์์ด์ด ๋ง์น ๋ฐฐ์ด์ฒ๋ผ ํ๋์ฉ ์ํํ๋ ๊ฒ์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
#!/usr/bin/bash
mystring="foo bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
$ bash script.sh
Word: foo
Word: bar
Word: baz
Word: rab
IFS๊ฐ์ด ๊ณต๋ฐฑ์ด๋ผ ๊ณต๋ฐฑ์ ๋ฐ๋ผ ๋จ์ด๊ฐ ์ชผ๊ฐ์ง๋ค๋ ๊ฒ์ ์์๋ค. ๊ทธ๋ผ IFS๊ฐ์ ๋ฐ๊พธ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
#!/usr/bin/bash
IFS=':' # ๋ฌธ์์ด ๊ตฌ๋ถ์ : ๋ก ํ๋ค.
mystring="foo bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
$ bash script.sh
Word: foo bar baz rab
๊ฒฐ๊ณผ์์ ๋ณผ ์ ์๋ฏ์ด, ๊ทธ๋๋ก ํ๋์ ๋ฌธ์์ด๋ก ์ถ๋ ฅ์ด ๋์ด๋ฒ๋ ธ๋ค. ๋จ์ด๋ฅผ ์ชผ๊ฐ๋ ๊ธฐ์ค์ ๋๋ ๋ฌธ์๊ฐ ๊ณต๋ฐฑ์์ : ๋ก ๋ฐ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ์์ฉํ์๋ฉด ๋ฌธ์์ด์ "foo:bar:baz:rab" ๋ก ๋ฐ๊พธ๋ฉด ์ฒ์์ฒ๋ผ ์ ์์ ์ผ๋ก ์ํ๊ฐ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง IFS๋ ํ๊ฒฝ๋ณ์์ด๊ธฐ ๋๋ฌธ์, ์ด๋ ํ ์ ์คํฌ๋ฆฝํธ์์ IFS๊ฐ์ ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด ๋ค๋ฅธ ์ ์คํฌ๋ฆฝํธ์์ ์ค์๋์ด ์ผ์ด๋ ์ ์๋ค. ์์ ๊ฐ์ด ๋จ์ด ๊ตฌ๋ถ์ : ๋ก ๋ฐ๊ฟจ๋๋ฐ, ๋ค๋ฅธ ์์์ ๊ณต๋ฐฑ์ผ๋ก ๋จ์ด๋ฅผ ๊ตฌ๋ถํด ๋ฃจํ๋ฅผ ํ๋ค๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์ง ๋จ์ผ๋ฉด, ์ฝ๋๊ฐ ์์ ํ ๋ง๊ฐ์ง๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ๋ง์ผ IFS์ ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ผ์ด ์์ผ๋ฉด, ๋ฐ๋์ ๋ง์ง๋ง์ ๋ค์ ์ด๊ธฐ IFS๊ฐ์ผ๋ก ๋กค๋ฐฑํด์ผ ํ๋ ๋ก์ง์ ๋ฐ๋์ ๊ตฌํํด ๋์์ผ ํ๋ค.
#!/usr/bin/bash
PRE_IFS=$IFS # ๋ณธ๋ IFS๊ฐ์ ๋ฐฑ์
ํด๋
ผ๋ค.
IFS=':' # ๋ฌธ์์ด ๊ตฌ๋ถ์ : ๋ก ํ๋ค.
mystring="foo bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
IFS=$PRE_IFS # IFS ์์ ๋ณต๊ตฌ
IFS๋ ๋ํดํธ ๊ฐ์ ๊ณต๋ฐฑ/ํญ/๊ฐํ ๋ฌธ์๋ค. ๋ง์ผ ๊ณต๋ฐฑ์ด ์๋ค๋ฉด ๊ฐํ์ผ๋ก ๊ฐ ๋จ์ด๋ฅผ ๊ตฌ๋ถํ๋ค.
๋ค์์ IFS๋ฅผ ์ฐ์ ๊ฐ์ ๊ฐํ์ผ๋ก ๋ฐ๊พธ๋ ์์ ์ด๋ค.
PROGRAMMING="
java programming
python programming
c programming
" # ๊ฐํ์ด ์๋ ๋ฌธ์์ด
echo "-------------------------"
for p in $PROGRAMMING; do
echo $p # IFS๋ ๊ณต๋ฐฑ์ ๋จผ์ ๊ตฌ๋ถ์๋ก ํ๊ณ , ๊ณต๋ฐฑ์ด ์๋ค๋ฉด ๊ฐํ์ ๊ตฌ๋ถ์๋ก ์ค์ ํ๋ค.
done
# IFS๋ฅผ ์ค๋ฐ๊ฟ(newline)๋ก ๋ณ๊ฒฝ
OLD_IFS="$IFS" # ๋ฐฑ์
IFS=$'\n'
echo "-------------------------"
for p in $PROGRAMMING; do
echo $p
done
IFS="$OLD_IFS" # ๋กค๋ฐฑ
$ bash test.sh
-------------------------
java
programming
python
programming
c
programming
-------------------------
java programming
python programming
c programming
# ์ฐธ๊ณ ์๋ฃ
https://copyprogramming.com/howto/meaning-of-no-ifs
https://palyoung.tistory.com/136