OS/Linux

๐Ÿง IFS(Internal Field Separator) ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ฆฌ

์ธํŒŒ_ 2022. 3. 21. 11:49

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