Shell script
: 명령어와 스크립트 구문으로 구성된 파일
• 일련의 Statement(문장)로 구성 :
명령어(Command) 또는 다른 스크립트 파일 호출 가능,
파일 내 작성된 구문을 차례대로 실행.
• 인터프리터가 필요 :
Script 파일은 인터프리터를 통해 한 줄씩 읽고 실행.
• 첫 번째 줄에 #!pathname 작성 :
#! : 스크립트를 실행할 인터프리터의 경로를 지정.
ex) Bash shell
#!/bin/bash
Shell script의 실행
: 실행 권한 없이도 실행 가능.
스크립트를 Bash 인터프리터로 직접 실행.
$ bash script_file
$ chmod +x script_file
$ ./script_file
Shell script의 Argument
ex)
$ vi argument.sh
#!/bin/bash
echo $1 $2 $3 $4 $0 # 첫 번째 ~ 네 번째 Argument와 스크립트 이름 출력
echo $* # 모든 Argument 출력
echo $# # 전달된 Argument 개수 출력
• echo $1 $2 $3 $4 $0
$1, $2, $3, $4는 전달된 값들.
$0은 스크립트 이름인 argument를 출력.
Programming 언어로서의 Shell script
Shell Command
• 내부 명령어 (Shell built-in command):
쉘 자체에서 제공하는 기본 명령어. ex) cd, echo, pwd
• 외부 명령어 (Executable file):
실행 가능한 파일로 존재하는 명령어. ex) /bin/ls, /usr/bin/who
Other Script File
: 다른 스크립트를 호출하여 실행하는 형태.
if
: 조건에 따라 명령을 실행하는 구문.
while
: 조건이 참인 동안 반복 실행.
for
: 리스트나 범위에서 반복 실행.
case
: 여러 조건 중 하나를 선택하여 실행.
if statement
if [ 조건 ]
then
statement
elif [ 조건 ]
then
statement
else
statement
fi
첫 번째 조건이 참이면 해당 then 블록 실행.
첫 번째 조건이 거짓이고, elif 조건이 참이면 해당 then 블록 실행.
모든 조건이 거짓이면 else 블록 실행.
조건 연산자
< 주의사항 >
• 연산자 앞뒤에는 반드시 빈칸이 있어야 함. → 구문 오류 발생
• 숫자 비교 연산자는 문자열 비교 연산자와는 다른 방식으로 동작.
: 숫자를 비교할 때는 -eq, -gt 등을 사용,
문자열을 비교할 때는 = 또는 !=를 사용.
: 파일의 존재 여부나 속성을 확인하기 위한 조건 연산자
: 여러 조건을 결합하거나 논리적으로 평가할 때 사용
NumPrint.sh 라는 파일은 다음 속성을 가짐:
일반 파일
읽기 및 쓰기 권한 있음
실행 권한 없음
if [ $1 -nt $2 ]
$1이 $2보다 "새로운 파일(newer file, 나중에 수정되었음)"인 경우
if [ $1 -ot $2 ]
$1이 $2보다 "오래된 파일(older file, 먼저 수정되었음)"인 경우
if [ -f $1 -a $1 -nt $2 ]
$1이 일반 파일인지 확인 (-f $1) ,
$1이 $2보다 최신인지 확인 (-nt $2)
if [ -f $1 -a $1 -ot $2 ]
$1이 일반 파일인지 확인 (-f $1) ,
$1이 $2보다 오래된 파일인지 확인 (-ot $2)
while statement
• while 루프
: 주어진 조건이 True인 동안 특정 명령(statement)을 반복 실행하는 구조
while [ 조건 ]
do
statement
done
: 숫자 1~9를 출력
#!/bin/bash
x=1 # 초기 변수 x를 1로 설정
while [ $x -lt 10 ] # x가 10보다 작을 때 반복 (-lt : 작다)
do
echo $x # x의 값을 출력
let x=$x+1 # x 값을 1 증가
done
• for 루프
: 지정된 값 목록(value1, value2, ...)을 순회하며 각 값에 대해 특정 명령(statement)을 실행하는 구조
for 변수 in value1 value2 ... valueN
do
statement
done
case statement
case 문
: 특정 변수 값에 따라 여러 명령을 조건부로 실행할 수 있도록 설계된 제어 구조
case $변수 in
값1) 명령어 ;;
값2) 명령어 ;;
...
*) 기본 명령어 ;;
esac
: caseTest.sh
#!/bin/bash
case $1 in
“JIM”) echo Hi Jim ;;
“TOM”) echo Hi Tom ;;
*) echo Who are you? ;;
esac
Function
: Bash 스크립트에서 함수를 정의하고 사용하는 방법
function 함수명 {
statement
return 결과값 # 선택 사항
}
: fnTest.sh
#!/bin/bash
# foo 함수 정의
function foo {
echo "foo"
boo # boo 함수 호출
}
# boo 함수 정의
function boo {
echo "boo"
}
# foo 함수 호출
foo
: 주어진 자연수들의 합계(Sum), 평균(Average), 그리고 최대값(Max)을 계산하는 Bash 스크립트
#!/bin/bash
sum=0; avg=0; max=0; num=$#
if [ $# -eq 0 ]
then
echo "Usage: $0 n1 n2 ..."
exit 1
fi
# 합계 계산 함수
function fsum {
for i in $@
do
let sum=$sum+$i
done
}
# 평균 계산 함수
function favg {
let avg=$sum/$num
}
# 최대값 계산 함수
function fmax {
for i in $@
do
if [ $i -gt $max ]
then
max=$i
fi
done
}
fsum $@
favg
fmax $@
# 메인 코드
echo "Sum = $sum"
echo "Average = $avg"
echo "Max = $max"
: 재귀 함수를 사용하여 팩토리얼(Factorial)을 계산하는 Shell 스크립트
#!/bin/bash
function fact {
local x=$1 # 현재 입력 값
let local y=$x-1 # x-1 값 계산
local z=1 # 기본값 z=1 초기화
if [ $x -gt 1 ] # x가 1보다 클 경우 재귀 호출
then
fact $y # fact 함수 재귀 호출
let z=$x*$? # 재귀 호출 결과값에 현재 x를 곱함
fi
return $z # 계산된 z 값을 반환
}
fact $1 # 사용자가 입력한 값으로 fact 호출
echo "$1! = $?" # 결과 출력