쉘 스크립트 프로그래밍 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에서만 통하는 지역 변수인 반면, var2는 export로 선언해 외부 변수가 되었다. 그래서 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