1. #!/bin/bash (shebang line)
- #!은 스크립트의 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에게 알려주는 역할을 한다. #!은 두 바이트의 "매직 넘버"(magic number)로서, 실행 가능한 쉘 스크립트라는 것을 나타내는 특별한 표시자이다.
- 기본 본쉘인 #!/bin/sh을 사용하면 bash만 가지는 몇몇 기능을 사용 못 하겠지만 대부분의 리눅스 외 머신에 쉽게 이식할 수 있게 해준다.
- 절대경로를 사용하는 shebang의 제약을 우회하기 위해 #!/usr/bin/env 유틸리티를 사용하기도 한다. 인터프리터의 경로가 OS마다 시스템마다 다를 수 있으므로 이런 문제를 해결하기 위해 사용할 수 있다.
- #!/usr/bin/env python 의 경우 PATH에 등록된 경로를 순서대로 검색하여 제일 먼저 나온 python 버전을 호출한다. 만약 특정 python 버전을 지정하고 싶다면 python2.7과 같이 버전을 특정하는 명령을 사용하면 된다. (python 과 함께 설치됨)
- 스크립트에서 내부 쉘 지시자를 안 쓰고 일반적인 시스템 명령들만 사용한다면 #!는 쓰지 않아도 괜찮다.
- #으로 시작하기 때문에 #을 주석 문자로 사용하는 모든 스크립트 언어에서 사용 가능하다.
2. Shell script 실행
- sh scriptname, bash scriptname
- sh는 표준입력에서 읽는 것을 사실상 막아서 권장하지 않음, bash 스크립트를 sh로 실행시키면 bash 전용 기능이 실행 안 될 수 있음
- ./scriptname
- 더 편한 방법으로, 읽기,실행권한을 부여한 후 직접 실행하는 것.(실행할려면 쉘이 스크립트를 읽어야 하기 때문에 읽기 권한도 필요)
- 스크립트 저장 위치
- 개인 목적으로 사용하는 스크립트는 ~/bin에 저장(디렉토리를 생성했다면). 테스트와 디버깅이 끝난 후 다른 사용자들이 쓸 수 있게 하려면 /usr/local/bin에 옮김. 시스템 관리자용 스크립트는 /usr/local/sbin, 시스템용 프로그램은 /usr/local /usr/local/bin으로 이동시키면 scriptname을 치는 것만으로 실행 가능.
- 현재 경로에 스크립트가 있는데도 ./을 붙여야만 실행되는 이유는 보안 상의 이유로 현재 디렉토리를 나타내는 .은 사용자의 $PATH에 들어있지 않기 때문. 따라서 현재 디렉토리의 스크립트를 실행하려면 ./으로 경로를 알려줘야 한다.
3. 스크립트 작성
- 유지보수 용이성을 위해 가능하면 스크립트 옵션을 축약형 대신 확장형으로 작성한다.
- 긴 문장은 백슬래쉬를 사용하여 여러 줄로 표시하는 것이 가독성에 유리하다.
- 배열
- 이름=(변수1, 변수2...)
- 배열[*] = 배열의 모든 원소
- 배열[@] = 배열의 모든 원소
- #배열[*] = #배열[@] = 배열의 원소 개수
- 숫자 계산을 위한 연산자
- expr : 변수값을 숫자로 지정하여 연산할 수 있게 함
- expr을 사용하는 경우 (1옆의 키) 로 감싸야 함
- 사칙연산자 사용 가능( *, 괄호 앞에는 \ 붙여야 함)
- 연산자와 숫자, 변수, 기호 사이에는 space 존재
- 입력 받기
- read를 사용하여 사용자의 입력을 받을 수 있음
- echo에 -n을 붙이면 개행하지 않음
- 조건문
- if [조건문] then ~~ elif [조건문] then ~~ else ~~ fi
- 숫자 비교
- 예시 : [$A -gt $B]
- -gt : 보다 더 크다
- -gt : 크거나 같다
- -lt : 보다 더 작다
- -le : 작거나 같다
- -eq : 같다
- -ne : 다르다
- 문자 비교
- 예시 : ["string1" = "string2"]
- =, !, -z(문자열의 길이가 0인 경우 즉 NULL), -n(문자열이 NULL이 아닌 경우)
- 기타 조건
- [-e "path"] : path의 파일이나 디렉토리가 있는 경우
- 관계연산자
- -a : and, -o: or
- for 문
for 변수 in 변수값1 2 3
do
문장
done
- while문
while [조건문]
do
문장
done
- until문
- while과 반대로 거짓이면 루프를 돌고 참이면 루프 종료
- case문
case 변수 in
패턴1)
문장
끝문장;;
패턴2)
문장
끝문장;;
*)
문장
끝문장;;
esac
- 사전 정의 환경변수 (의미가 정해진 환경변수)
- $USER : 사용자 이름
- $TERM : 터미널 타입
- $PATH : 명령어를 검색할 디렉터리들의 리스트
- $HOME : 홈 디렉터리
- $SHELL : 로그인 쉘의 경로명
- $MAIL : 메일 박스의 경로명
- $HOSTNAME : 호스트 이름
- 사전 정의 지역변수
- $$ : 쉘의 프로세스 번호
- $0 : 쉘 스크립트 이름
- $1 ~ $9 : 명령줄 인수
- $* : 모든 명령줄 인수 리스트
- $# : 명령줄 인수의 개수