shell 이란?
- 사용자와 커널 사이에서 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 한다.
쉘 프로그래밍 기본 설정
- 쉘 스크립트를 사용한 파일은 .sh 확장자를 가지고, 맨 처음 행에 #!/bin/bash를 쓴다.
#!/bin/bash
echo "Hello World"
- 실행 방법(example.sh)은 다음 사진과 같다.
1) 실행권한을 부여하고 실행
$ chmod 755 example.sh
$ ./example.sh
2) sh 명령어를 이용하여 실행
$ sh example.sh
- 주석은 #을 사용한다. 주석처리 된 코드는 실행되지 않는다.
#!/bin/bash
echo "Hello World" #주석은 실행되지 않음.
변수 활용
- 변수 값을 대입할 때는 '='를 기준으로 앞, 뒤에 공백이 없어야 한다.
- 변수를 사용할 때는 $[변수명] 형태로 사용한다.
#!/bin/bash
string="test"
num=5
echo "string : $string"
echo "num : $num"
<출력 값>
string : test
num : 5
- 사용자에게 입력을 받아 변수에 저장할 때는 read 명령어를 사용한다.
#!/bin/bash
echo -n "Input >> "
read input
echo "Input data : $input"
- 특별한 변수
변수 | 설명 |
$0 | 실행되는 파일의 이름 (스크립트명) |
$1 ~ $9 | 인자 값(공백을 기준으로 나누 |
$* | 모든 인자 출력 |
$# | 인자의 개수 출력 |
$@ | 모든 인자 각각 처리 |
$? | 바로 전에 실행한 면령어의 종료 값(0:성공, 1:실패) |
$$ | 현재 쉘 스크립트의 PID(프로세스 ID) |
$! | 마지막으로 실행한 백그라운드 PID |
#!/bin/bash
echo "\$0 : $0"
echo "\$1 : $1"
echo "\$2 : $2"
echo "\$* : $*"
echo "\$# : $#"
echo "\$\$ : $$"
<출력 값>
# 입력예제 : ./example.sh hello 1
$0 : example.sh
$1 : hello
$2 : 1
$* : hello 1
$# : 2
$$ : 731 #프로세스ID
숫자의 연산
- num3=`expr $num1 + $num2` 와 같은 형태로 숫자의 연산 수행.
- 이때 '=' 앞뒤로 띄어쓰기를 꼭 하지 않고, `(역따옴표)로 묶어 expr 명령어를 수행한다.
- expr 명령어에서는 연산자와 피연산자 사이를 꼭 띄어쓰기를 사용해야 한다.
#!/bin/bash
echo -n "Input num1 >> "
read num1
echo -n "Input num2 >> "
read num2
sum=`expr $num1 + $num2`
echo "plus : $sum"
echo "minus : `expr $num1 - $num2`"
echo "mul : `expr $num1 \* $num2`"
echo "div : `expr $num1 % $num2`"
<출력 값>
Input num1 >> 5
Input num2 >> 3
plus : 8
minus : 2
mul : 15
div : 2
특수문자
- 숫자의 연산에서 확인해보면 곱하기를 수행하는 행에서 '*' 앞에 역슬래시(\)가 사용된 것을 볼 수 있다.
- expr 연산에서는 연산자로 사용하기 위해 역슬래시(\)가 사용되고, 일반적으로는 특수문자의 역할이 아닌 일반 문자열을 표현하고 싶을 때 역슬래시(\)를 사용한다.
비교 연산자
- 사용 형태는 조건문 예제의 '-gt'와 같다.
비교 명령어 | 의미 |
-gt | 크다 (>) |
-ge | 크거나 같다 (>=) |
-lt | 작다 (<) |
-le | 작거나 같다 (<=) |
-eq | 같다 (==) |
-ne | 다르다 (!=) |
-n | null이 아니면 true |
-z | null이면 true |
조건문 (if)
- 기본 문법은 if [ 조건 ] ; then 명령어 fi 이다. 예제를 통해 확인해보자.
#!/bin/bash
echo -n "Input number? "
read num
if [ $num -gt 5 ]; then
echo "$num is greater than 5"
else
echo "$num is less than 5"
fi
<출력 값>
Input number? 7
7 is greater than 5
조건문 (switch)
- 기본 문법은 case 변수 in 패턴) 명령어;; esac이다. 예제를 통해 확인해보자.
- 마지막 패턴인 *는 위에 패턴을 제외한 모든 경우를 지칭한다.
#!/bin/bash
echo -n "Input jumsu : "
read jumsu
grade=`expr $jumsu / 10`
case $grade in
"10") echo A;;
"8") echo B;;
"7") echo D;;
*) echo F;; # *는 따옴표로 묶을 경우 문자로 인식한다.
esac
<출력 값>
Input jumsu : 100
A
파일 비교 연산자
비교 명령어 | 의미 |
-f [파일명] | 파일이 일반파일이면 true |
-d [파일명] | 파일이 디렉토리이면 true |
-r [파일명] | 파일이 읽기 권한이 있으면 true |
-w [파일명] | 파일이 쓰기 권한이 있으면 true |
-x [파일명] | 파일이 실행 권한이 있으면 true |
-e [파일명] | 파일의 존재여부, 있으면 true |
-z [파일명] | 파일의 크기가 0이면 true |
예제) -d를 이용해서 $1(인자1)로 받은 경로의 파일이 몇개가 있는지 확인하는 프로그램
#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage : command arg1"
exit 1
else
if [ -d $1 ]; then
file_cnt=`ls -l $1 | wc -l`
echo "directory '$1' file_cnt : $file_cnt"
fi
fi
반복문 (for)
- 기본 문법은 for 변수 in 단어리스트 do 명령어 done 이다.
for ch in a b c
do
echo "For statement : $ch"
done
<출력 값>
For statement : a
For statement : b
For statement : c
예제1) 디렉토리 경로를 입력받아 해당 경로의 모든 파일의 백업본을 생성하는 프로그램
#!/bin/bash
echo -n "Input directory? "
read dir
for ch in `ls $dir`
do
cp $dir/$ch $dir/$ch.bak
done
예제2) 단을 입력받는 구구단 프로그램
#!/bin/bash
echo -n "Input dan >> "
read dan
for i in {1..9}
do
result=`expr $dan \* $i`
echo "$dan * $i = $result"
done
반복문(while)
- 기본 문법은 while 조건 do 명령어 done 이다.
#!/bin/bash
a=0
while [ $a -lt 5 ]
do
echo "$a"
a=`expr $a + 1`
done
함수
- 함수의 선언은 '함수이름() { 명령어 }' 으로 한다.
- 함수의 호출은 '함수이름 [인자1] [인자2]'으로 한다.
#!/bin/bash
prt()
{
echo "prt function.. $1 $2"
}
echo "test..."
prt 5 2
<출력 값>
test...
prt function.. 5 2
예제) 각 연산을 함수로 구현한 계산기 프로그램
#!/bin/bash
plus()
{
echo "$1 + $2 = `expr $1 + $2`"
}
minus()
{
echo "$1 - $2 = `expr $1 - $2`"
}
mul()
{
echo "$1 * $2 = `expr $1 \* $2`"
}
div()
{
echo "$1 / $2 = `expr $1 / $2`"
}
mod()
{
echo "$1 % $2 = `expr $1 % $2`"
}
echo -n "Input number >> "
read num1 num2
echo -n "Input operate >> "
read op
case $op in
"+") plus $num1 $num2;;
"-") minus $num1 $num2;;
"*") mul $num1 $num2;;
"/") div $num1 $num2;;
"%") mod $num1 $num2;;
*) echo "Error.. Invalid operate";;
esac
번외) vi 편집기를 열어서 자동으로 글 입력 프로그램
#!/bin/bash
if [ -f $1 ]; then
echo "Error.. File exist!!"
else
echo "#####################" >> $1
echo "## Author : Lee Ye Jun#" >> $1
echo "## Date : `date | cut -c1-13`" >> $1
echo "#####################" >> $1
echo "#!/bin/bash" >> $1
echo " " >> $1
vi +$ $1
chmod 755 $1
fi