꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

시스템 프로그래밍

쉘 스크립트

gold_dragon 2021. 5. 7. 15:28

쉘을 사용해서 프로그래밍을 할 수 있습니다. 서버 작업 자동화 및 운영을 위해 기본적으로는 익혀둘 필요가 있습니다. 쉘 명령어를 기본으로 하되, 몇가지 문법이 추가된 형태입니다.

기본문법

쉘 스크립트는 파일로 작성 후, 파일을 실행하는 형식입니다. 파일의 가장 위의 첫 라인은 '#!/bin/bash'로 시작합니다. 쉘 스크립트 파일은 실행 권한을 가지고 있어야 합니다. 일반적으로 '파일이름.sh'와 같은 형태로 파일 이름을 작성합니다.

 

(bash 쉘에서 제공하는 echo 함수를 이용해서 화면에 'Hello bash!' 출력 예시)

--> hello.sh 파일에 작성

#!/bin/bash

echo 'Hello bash!'

--> 실행이 안된다면 실행 권한을 확인해야 합니다.

변수

선언 방법은 띄어쓰기 없이 '변수명=데이터'로 선언할 수 있습니다. '$변수명'을 통해서 사용할 수 있습니다.

 

(실제 이름, 나이, 직업을 선언하는 예시)

--> id.sh 파일에 작성

#!/bin/bash

myname='GeumyongSeok'

myage=20

mycareer='IT'

echo $myname $myage $mycareer

리스트 변수 (배열)

'변수명=(데이터1 데이터2 데이터3)' 형식으로 변수를 선언할 수 있습니다. '${변수명[인덱스번호]}'를 통해서 사용할 수 있습니다.

 

ex)

#!/bin/bash

daemons=('http' 'mysql' 'vsftpd')

echo ${daemons[1]}

# $daemons 배열의 두 번째 인덱스에 해당하는 mysql 출력

echo ${daemons[@]}

# $daemons 배열의 모든 데이터 출력

echo ${daemons[*]}

# $daemons 배열의 모든 데이터 출력

echo ${#daemons[@]}

# $daemons 배열 크기 출력

filelist=( $(ls) )

# 해당 쉘스크립트 실행 디렉토리의 파일 리스트를 배열로 $filelist 변수에 입력

echo ${filelist[*]}

# $filelist 모든 데이터 출력

사전에 정의된 지역 변수

$$: 쉘의 프로세스 번호

$0: 쉘 스크립트 이름

$1 ~ $9: 명령줄 인수

$*: 모든 명령줄 인수리스트

$#: 인수의 개수

$?: 최근 실행한 명령어의 종료 값 ( 0 -> 성공 / 1 ~ 125 -> 에러 / 126 -> 파일이 실행가능하지 않음 / 128 ~ 255 -> 시그널 발생)

연산자

expr은 숫자 계산을 합니다. expr을 사용하는 경우 역작은 따옴표(`)를 사용해야 합니다. 연산자 *와 괄호 앞에는 역슬래시를 같이 사용합니다. 연산자와 숫자, 변수, 기호 사이에는 띄어쓰기를 넣어줘야 합니다.

 

ex)

num = `expr \( 3 \* 5 \) / 4 + 7`

조건문

기본 if 구문

명령문을 꼭 탭으로 띄워야 하는 것은 아닙니다. (then과 fi 안에만 들어가 있으면 됩니다.)

 

if [ 조건 ]

then

  명령문

fi

 

조건

문자1 == 문자2 : 문자1과 문자2가 일치

문자1 != 문자2 : 문자1과 문자2가 일치하지 않음

-z 문자 : 문자가 null이면 참

-n 문자 : 문자가 null이 아니면 참

 

수치 비교 (위의 조건 같은 경우 if 조건 시 [[]]를 넣는 경우 정상 작동하지만, 기본적으로 다음 문법을 사용하는 것을 권장합니다.)

값1 -eq 값2 : 값이 같음

값1 -ne 값2 : 값이 같지 않음

값1 -lt 값2 : 값1이 값2보다 작음

값1 -le 값2 : 값1이 값2보다 작거나 같음

값1 -gt 값2 : 값1이 값2보다 큼

값1 -ge 값2 : 값1이 값2보다 크거나 같음

 

파일 검사

-e 파일명 : 파일이 존재하면 참

-d 파일명 : 파일이 디렉토리면 참

-h 파일명 : 심볼릭 링크 파일이면 참

-f 파일명 : 파일이 일반파일이면 참

-r 파일명 : 파일이 읽기 가능하면 참

-s 파일명 : 파일 크기가 0이 아니면 참

-u 파일명 : 파일이 set-user-id가 설정되면 참

-w 파일명 : 파일이 쓰기 가능 상태이면 참

-x 파일명 : 파일이 실행 가능 상태이면 참

 

(해당 파일이 있는지 없는지를 출력하는 쉘 스크립트 예시)

#!/bin/bash

if [ -e $1 ]

then

  echo 'file exist'

fi

 

논리 연산

조건1 -a 조건2 : AND

조건1 -o 조건2 : OR

조건1 && 조건2 : 양쪽 다 성립

조건1 || 조건2 : 한쪽 또는 양쪽 다 성립

!조건 : 조건이 성립하지 않음

true : 조건이 언제나 성립

false : 조건이 언제나 성립하지 않음

 

기본 if/else 구문

if [ 조건 ]

then

  명령문

else

  명령문

fi

반복문

for문

for 변수 in 변수값1 변수값2 ...

do

  명령문

done

 

(현재 디렉토리에 있는 파일과 디렉토리 출력 예시)

#!/bin/bash

for database in $(ls)

do

  echo $database

done

 

while문

while [조건문]

do

  명령문

done

 

(현재 디렉토리에 있는 파일과 디렉토리 출력 예시)

#!/bin/bash

lists=$(ls)

num=${#lists[@]}

index=0

while [$num -ge 0]

do

  echo ${list[$index]}

  index=`expr $index + 1`

  num=`expr $num - 1`

done

 

'시스템 프로그래밍' 카테고리의 다른 글

메모리와 mmap  (0) 2021.05.07
스레드 관리  (0) 2021.05.07
시그널 (signal)  (0) 2021.05.07
IPC 기법  (0) 2021.05.07
프로세스 관리 - 프로세스 종료  (0) 2021.05.06