쉘 스크립트

쉘로 시작하는 시스템 프로그래밍 기본

쉘 스크립트

쉘을 사용한 프로그래밍 작업으로서 서버 작업 자동화 및 운영(DevOps)를 위해서 기본적으로 익혀둘 필요가 있다.

로그가 많이 쌓여서 서버가 죽을 경우 스크립트를 생성해서 로그를 주기적으로 삭제 하도록 하는 등의 작업을 들 수 있다.

기본 문법

#!/bin/bash로 시작해야 하고 실행 권한을 가지고 있어야 한다. 파일 이름은 일반적으로 파일이름.sh와 같은 형태로작성한다.

실습

echo 함수를 이용하여 화면에 Hello bash!"를 출력 할 수 있도록 스크립트 작성

1
2
3
#!/bin/bash

echo "Hello bash"

실행 권한이 있어야 한다. chmod +x test.sh

실행은 test.sh가 있는 폴더로 들어간 후 ./test.sh 입력.

주석

#으로 시작하면 주석이다.

변수

선언

  • 변수명=데이터로 사용한다. 띄어씌기는 허용되지 않는다.

사용

  • $변수명 으로 사용된다.
1
2
3
4
5
6
7
#!/bin/bash

mysql_id='root'
mysql_directory='/etc/mysql'

echo $mysql_id
echo $mysql_directory

실습

아이디 관련 정보 변수만들기 (실제 이름, 나이, 직업)

1
2
3
4
5
6
7
#!/bin/bash

name='koo'
age=27
job='no job'

echo $name $age $job

리스트

선언

  • 변수명=(데이터1 데이터2 데이터3 …)

사용

  • ${변수명[인덱스번호]} 로 사용한다.
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

daemons=("httpd" "mysqld" "vsftpd")
echo ${daemons[1]}
echo ${daemons[@]} # $daemons 배열의 모든 데이터 출력
echo ${daemons[*]} # $daemons 배열의 모든 데이터 출력
echo ${#daemons[@]} # daemons 배열 크기 출력

filelist=( $(ls) ) # 해당 쉘스크립트 실행 디렉토리의 파일 리스트를 배열로 $filelist 변수에 받음.
echo ${filelist[*]}

실습

아이디 관련 정보 리스트 변수로 만들고, 각 정보 출력하기

사전에 정의된 지역 변수

1
2
3
4
5
6
7
8
9
$$ : 쉘의 프로세스 번호
$0 : 쉘스크립트 이름
$1 ~ $9 : 명령줄 인수
$* : 모든 명령줄 인수리스트
$# : 인수의 개수
$? : 최근 실행한 명령어의 종료 값
- 0 (성공), 1~125 (에러)
- 126(파일이 실행가능하지 않음),
- 128~255 (시그널 발생)

실습

쉘 프로세스 번호, 쉘 스크립트 이름, 명령줄 인수, 모든 명령줄 인수리스트, 인수 개수 출력해보기

1
2
3
#!/bin/bash

echo $$ $0 $1 $* $#

연산자

expr: 숫자 계산

expr를 사용하는 경우 백틱을 사용해야 함. 연산자 *와 괄호 앞에는 역슬래시를 넣어야 한. 연산자와 숫자, 변수 사이에는 space를 넣어야 함.

1
2
3
4
#!/bin/bash

num=`expr \( 10 + 20 \) / 8 - 8`
echo $num

조건문 문법

기본 if 구문

  • 명령문을 꼭 탭으로 띄워야 하는 것은 아님(then과 if 안에만 들어가 있으면 됨.)

두 인자값을 받아서 두 인자값이 다르면 differnt values 출력

1
2
3
4
5
6
#!/bin/bash

if [ $1 != $2 ]
then
echo 'different values'
fi

조건 문에 띄어쓰기를 주의한다.

조건 작성이 다른 프로그래밍 언어와 달리 가동성이 현저히 떨어짐, 필요할때마다 찾아보길..

파일 검사

1
2
3
4
5
6
7
8
9
-e 파일명 # 파일이 존재하면 참
-d 파일명 # 파일이 디렉토리면 참
-h 파일명 # 심볼릭 링크파일
-f 파일명 # 파일이 일반파일이면 참
-r 파일명 # 파일 읽기 가능이면 참
-s 파일명 # 0 파일 크기가 0이 아니면 참
-u 파일명 # 파일이 set-user-id가 설정되면 참
-w 파일명 # 파일 쓰기 가능 상태이면 참
-x 파일명 # 파일이 실행 가능 상태이면 참

해당 파일이 있는지 없는지 출력하는 쉘 스크립트 작성해 보기

1
2
3
4
if [ -e $1 ]
then
echo "file exist"
fi

if else

1
2
3
4
5
6
7
8
#!/bin/bash

if [ $1 == $2 ]
then
echo 'same values'
else
echo 'different values'
fi

쉘 크립트 해석하기

1
2
3
4
5
6
7
8
9
#!/bin/bash

ping -c 1 192.168.0.1 1> /dev/null
if [ $? == 0 ]
then
echo "게이트웨이 핑 성공!"
else
echo "게이트웨이 핑 실패!"
fi

ping -c 1 192.168.0.1 1> /dev/null 응답 확인 요청 -c 1를 통해 1번만 요청, 1> /dev/null를 통해 응답 결과 표준 출력을 버림,

반복문

1
2
3
4
5
6
#!/bin/bash

for database in $(ls)
do
echo $database
done

for 문을 while로 바꿔서 사용도 가능. (일반적인 프로그래밍 언어처럼 사용 가능.