쉘 스크립트 프로그래밍 – 2

쉘 스크립트 프로그래밍 - 2

목차

쉘 스크립트 프로그래밍 2편에서는 사용자 정의 함수를 중심으로, 함수에 파라미터를 넘기는 방법과 eval·export·printf·set·shift 같은 자주 쓰는 명령을 예제로 정리한다. 각 명령마다 실제 스크립트 파일과 실행 결과를 함께 제시하므로, 셸 스크립트의 함수와 변수 처리 흐름을 손으로 따라가며 익힐 수 있다. (1편의 변수·제어문·반복문 기초를 먼저 익힌 뒤 보면 이해가 빠르다.)

사용자 정의 함수

사용자가 직접 함수를 작성하고 호출할 수 있다. 형식은 다음과 같다.

함수이름() {
  내용들
}

func1.sh

#!/bin/sh
myFuction() {
  echo "함수 안으로 들어 왔음"
  return
}
echo "프로그램을 시작합니다."
myFuction
echo "프로그램을 종료합니다."
exit 0

실행 결과

[root@localhost ~]# sh func1.sh
프로그램을 시작합니다.
함수 안으로 들어 왔음
프로그램을 종료합니다.

함수의 파라미터 사용

함수의 파라미터, 즉 인자를 사용하려면 함수를 호출할 때 뒤에 파라미터를 붙여서 호출하며, 함수 안에서는 $1, $2, … 로 사용한다. 형식은 다음과 같다.

함수이름() {
  $1, $2, ... 등을 사용
}
함수이름 파라미터1 파라미터2

func2.sh

#!/bin/sh
hap () {
  echo `expr $1 + $2`
}
echo "10 더하기 20을 실행합니다."
hap 10 20
exit 0

실행 결과

[root@localhost ~]# sh func2.sh
10 더하기 20을 실행합니다.
30

eval — 문자열을 명령으로 실행

eval은 문자열을 명령문으로 인식한다. 다음은 디렉터리 내의 .sh 파일을 전부 나열하는 프로그램이다.

eval.sh

#!/bin/sh
str="ls -l *.sh"
echo $str
eval $str
exit 0

실행 결과

[root@localhost ~]# sh eval.sh
ls -l eval.sh func1.sh func2.sh
-rw-r--r--. 1 root root 54 3월 21 11:55 eval.sh
-rw-r--r--. 1 root root 172 3월 21 11:49 func1.sh
-rw-r--r--. 1 root root 103 3월 21 11:52 func2.sh

export — 외부 변수 선언

export는 변수를 외부 변수로 선언한다. 선언한 변수를 다른 프로그램에서도 사용할 수 있게 한다.

exp1.sh

#!/bin/sh
echo $var1
echo $var2
exit 0

exp2.sh

#!/bin/sh
var1="지역변수"
export var2="외부 변수"
sh exp1.sh
exit 0

실행 결과

[root@localhost ~]# sh exp2.sh

외부 변수

var1은 exp2.sh에서만 통하는 지역 변수인 반면, var2export로 선언해 외부 변수가 되었다. 그래서 exp2.sh가 호출한 외부 프로그램 exp1.sh에서도 var2의 값이 출력되는 것이다.

printf — 형식 지정 출력

printf는 C 언어의 printf() 함수와 비슷하게 형식을 지정해서 출력할 수 있다.

printf.sh

#!/bin/sh
var1=100.5
var2="재미있는 리눅스"
printf "%5.2f nn t %s n" "$var1" "$var2"
exit

실행 결과

[root@localhost ~]# sh printf.sh
100.50
     재미있는 리눅스

set과 $() 명령

리눅스 명령의 실행 결과를 값으로 사용하려면 $(명령) 형식을 사용한다. 또, 그 결과를 파라미터로 사용하고자 할 때는 set 명령과 함께 쓴다.

set.sh

#!/bin/sh
echo "오늘 날짜는 $(date) 입니다"
set $(date)
echo "오늘은 $4 요일 입니다."
exit 0

$(date)date 명령을 실행한 결과를 보여준다. 그 결과가 set에 의해 $1, $2, … 등의 파라미터 변수에 저장된다. 4행에서는 date 결과의 4번째 파라미터인 ‘요일’이 출력된다.

실행 결과

[root@localhost ~]# sh set.sh
오늘 날짜는 2024. 03. 21. (목) 12:54:20 KST 입니다
오늘은 (목) 요일 입니다.

shift — 파라미터 변수 이동

shift는 파라미터 변수를 왼쪽으로 한 단계씩 이동(시프트)시킨다. 즉 $2 → $1, $3 → $2 … 의 형태로 작업이 일어난다. 이를 이용하면 개수를 모르는 여러 파라미터를 반복문으로 차례로 처리할 수 있다.

shift.sh

1  #!/bin/sh
2  myfunc () {
3    str=""
4    while [ "$1" != "" ] ; do
5      str="$str $1"
6      shift
7    done
8    echo $str
9  }
10 myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
11 exit 0

실행 결과

[root@localhost ~]# sh shift.sh
AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
  • 4행: $1 파라미터가 비어 있지 않은 동안 반복 수행한다. 처음 $1은 AAA이고, 한 번 반복하면 5·6행에 의해 $1이 BBB가 된다.
  • 5행: str 변수에 $1을 이어 붙인다.
  • 6행: 전체 파라미터를 왼쪽으로 시프트시킨다.

정리

이번 2편에서는 사용자 정의 함수와 파라미터 전달, 그리고 eval·export·printf·set·shift 명령을 살펴봤다. 함수와 파라미터 변수를 잘 활용하면 반복되는 작업을 묶어 재사용성 높은 셸 스크립트를 작성할 수 있다. 각 예제를 직접 실행해 보며 동작을 확인하는 것을 권한다.

💬 댓글 0

💬 댓글을 남기려면?
첫 댓글을 남겨보세요 ✨

이 콘텐츠가 도움이 됐나요?

누스쿨 커뮤니티에서 더 많은 커리어 전략을 나눠요