books/Linux

[모두의 리눅스] 셸 스크립트 (3) IFS

836586697769 2024. 8. 9. 20:05

IFS : 내부 필드 구분 문자

tree.sh

#!/bin/bash

list_recursive ()
{
	local filepath=$1
	local indent=$2
	
	# 들여쓰기를 적용하고 파일 이름만 추출하여 출력
	echo "${indent}$filepath##*/}"
	
		if [ -d "$filepath" ] ; then
			local fname
			for fname in $(ls "$filepath")
			do
			
			# 들여쓰기를 위한 공백을 추가하여 재귀 호출
			list_recursive "${filepath}/${fname}" " $indent"
		done
	fi
}

list_recursive "$1" ""
  • 파일 이름에 공백이 포함된 경우
# (1)
$ ls -l ~/test
list.txt
space file.txt
work.txt

# (2) 배시가 공백을 기준으로 단어를 구분
$ ./tree.sh ~/text
text
	list.txt
	space
	file.txt
	work.txt
  • IFS의 값에서 공백을 없애는 방법 → 작은따옴표 내에 개행 입력으로 IFS에 설정
# ... 생략 ...
IFS='
'
for fname in $(ls "$filepath")
do
# ... 생략 ...
  • 혹은
IFS=$'\n'
  • 결과
$ ./tree.sh ~/text
text
	list.txt
	space file.txt
	file.txt
	work.txt
  • IFS 값을 바꾸면 이후 실행하는 다른 명령어에도 영향을 미치기 때문에 환경 변수의 값을 바꾸기 전에 기존 값을 백업해 두고 처리가 끝난 후 원래의 값으로 돌려놓는 것이 좋음
_IFS=$IFS # IFS 값 복원
IFS=$'\n' # IFS에 개행만 설정

# ... (처리) ...

IFS=$_IFS # IFS 값 복원