- 1 -
셸 스크립트 예제
셸은 사용자가 터미널에서 입력한 명령을 해석해서 커널에 전달하고, 처리 결과를 화면에 보 여준다. 셸을 명령어 해석기라고도 한다. 셸의 종류도 다양한데, 우분투 리눅스는 배시 셸 (BASH, Bourne Again SHell)을 사용한다. 터미널에서 “bash —version”이라고 입력하면 배시 셸의 버전 정보를 확인할 수 있다.
$ bash --version
셸 스크립트는 실행할 명령어들을 나열해 놓은 파일이다. 셸 스크립트에 입력된 명령들을 셸 이 자동으로 실행할 것이다. 여러 명령을 조합하여 정해진 순서대로 자동 실행시킬 수 있다. 참 고로 “스크립트”라는 용어는 한 줄씩 읽어 와서 실행하도록 작성된 프로그램을 뜻한다.
● 예제 1
그럼 셸 스크립트를 작성해보자.
○ 파일 작성
$ gedit helloworld &
#!/bin/bash
echo “Hello! Shell Script!”
○ 파일 정보 확인
$ ls –l helloworld
○ 실행 권한 부여
$ sudo chmod +x helloworld
○ 파일 정보 확인
$ ls –l helloworld
○ 실행
$ ./helloworld
현재 작업 디렉터리가 어디든 상관없이 셸 스크립트를 실행하려면 적절한 디렉터리로 작성한 스크립트 파일을 옮겨야 한다. 셸은 환경 변수 PATH로 지정된 경로를 차례로 탐색해서 명령을 실행한다. echo 명령으로 현재 시스템에 설정된 환경 변수 PATH의 값을 확인할 수 있다.
$ echo $PATH
/home/cju/bin:/home/cju/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bi n:/usr/games:/usr/local/games:/snap/bin
사용자가 작성한 스크립트는 일반적으로 /usr/local/bin에 저장한다. /usr/local/bin은 소유권
- 2 -
이 루트에게 있으므로 helloworld를 옮길 때 sudo가 필요하다.
$ sudo cp helloworld /usr/local/bin/
이제 해당 셸 스크립트를 어느 디렉터리에서든지 실행할 수 있다.
$ helloworld
● 예제 2
시스템 로그(syslog)를 모니터링하는 sysloger라는 셸 스크립트를 만들어보자.
○ 파일 작성
$ gedit sysloger &
#!/bin/bash
tail /var/log/syslog > syslogresult
○ 실행 권한 부여
$ sudo chmod +x sysloger
○ 실행 ./sysloger
○ 생성된 파일 확인 cat syslogresult
셸 스크립트는 다른 프로그래밍 언어 못지않게 유연함과 강력함을 자랑한다. 변수를 사용해 보자. 변수에 값을 입력할 때는 대입 연산자 “=”를 사용한다(result=syslogresult). 이때 대입 연 산자 뒤에 공백이 있으면 안 되므로 주의해야 한다. 변수를 사용할 때에는 변수 이름 앞에 $를 붙인다($result).
#!/bin/bash result=syslogresult
tail /var/log/syslog > $result
변수만 사용했을 뿐 tail 결과를 syslogresult에 저장한다는 사실은 동일하다.
- 3 -
● 예제 3
옵션 없이 tail을 실행하면 10줄을 출력한다. 원하는 수만큼 출력하려면 –n 옵션을 사용해야 한다.
$ tail –n5 텍스트파일
○ 파일 수정
#!/bin/bash result=syslogresult
tail /var/log/syslog –n$1 > $result
새로운 변수 $1은 첫 번째 명령줄 인수를 저장하는 변수이다. 예를 들어 ./sysloger 5라고 입 력한다면 $1에는 5가 저장된다.
○ 결과 확인
$ ./sysloger 5
단, 명령줄 인수를 적지 않고 ./sysloger를 실행하면 –n 다음 값이 없기 때문에 오류가 발생 한다.
$ ./sysloger
○ 문제 해결
#!/bin/bash result=syslogresult line=${1:-10}
tail /var/log/syslog –n$line > $result
${번호:-기본값}은 해당 명령줄 인수가 존재하지 않으면 인수 값은 기본값을 갖는다.
○ 결과 확인
$ ./sysloger
$ ./sysloger 2
● 참고문헌
신재훈. (2015). 리눅스 서버를 다루는 기술. 서울: 길벗.