[Linux]Shell Script

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 : 명령줄 인수
    • $* : 모든 명령줄 인수 리스트
    • $# : 명령줄 인수의 개수