윈도우에 배치파일이 있듯이 리눅스에는 쉘 스크립트가 있다. 이 쉘 스크립트를 이용을 잘 하면 운영체제를 이용하면서 하게 되는 작업을 자동화시키는데 큰 기여를 한다.
그 외에도 평소에 뭔가하는 작업에 대해서 자동화하는데 필수적이고 복잡한 작업을 미리 정의해둠으로서 노동소모를 줄일 수 있다.


1. 쉘 스크립트의 기본 작성

#!/bin/bash
#주석
echo "Hello World!!!"


다음과 같은 구성을 가지게 된다.

첫번째 줄은 이 쉘 스크립트가 어떤 쉘을 바탕으로 실행되는가? 이다.
작성한 쉘 스크립트를 '쉘 [쉘스크립트명]' 같은 방식으로 사용할 수도 있지만, 일반적인 실행 프로그램 처럼 실행할 때. 첫 행에 작성된 #! 부분을 보고 결정하게 된다.

두번째 줄은 주석이다. 쉘 스크립트를 작성하면서 나중에 다시 수정을 할 수도 있는데. 이때 이게 어떤 코드였는지. 헷갈릴 가능성이 많고, 다른 사람이 이 스크립트를 받았을 때. 이해하는데 도움을 준다.
주석을 잘 작성해두는 것은 프로그래밍에서 좋은 습관이니 잘 애용하도록 하자.

세번째 줄은 스크립트이다.



2. 권한
쉘에 작성한 스크립트를 인수로 넣어서 실행하는 방법도 있겠지만, 그냥 바로 실행 파일처럼 실행할 수 있기 때문에 실행권한을 부여해주어야 한다.
chmod u+x 쉘스크립트

해당 명령어로 실행권한을 부여하여 스크립트를 평범하게 사용할 수 있도록 하자.



3. 변수

생성
변수의 사용방법은 다른 별 다를 것은 없고 그냥 선언 없이 사용을 하면 즉시 선언된다.

value=3
value="Hi everyone!"

주의할 점은 =의 좌우에 공백이 들어가서는 안된다.

변수의 사용
변수를 불러 올 때에는 $변수명이라고 하면 된다.

#생성
value=3
#사용
echo "$value"

변수를 읽기 전용으로 만들기
readonly 변수명

변수의 삭제
unset 변수명



4. 매개 변수
스크립트를 실행할 때 매개변수를 받을 수 있다.

$0 : 현재 파일 명
$# : 입력된 매개변수의 수
$1 : 첫 번째 매개 변수
$2 : 두 번째 매개 변수



5. 기본 입출력
출력을 할 때는. echo라는 명령어를 사용한다.

echo "텍스트"

자세한 사용에 대해서는 man을 참고하도록 하자... 어짜피 출력을 할 이유가 있다면, 입력을 받기전에 어떤거 입력해달라하는거나 진행상황 알림 정도니까 크게 알 필요는 없을 것 이다.


입력을 할 때는 read를 사용한다.

read 변수이름 ...

변수이름을 띄워쓰기로 여러개 구분해서 한번에 여러 값을 입력받을 수도 있다.



6. 따옴표의 의미
쉘 스크립트에서 따옴표는 각기 다른 의미를 가진다.

따옴표("")
변수가 있을 시 변수의 내용을 그대로 출력한다.

다음은 출력 예시이다.

$ echo "PS1=$PS1"
PS1=[\u@\h \W]\$

텍스트 중간에 변수인 $PS1이 있을 시 변수의 내용을 출력해준다.

작은 따옴표('')
작은 따옴표 내의 내용을 그대로 출력한다.

다음은 출력 예시이다.

$ echo 'PS1=$PS1'
PS1=$PS1

다음과 같이 그냥 그대로 출력된다.

역 따옴표(``)
역 따옴표 내의 내용을 실행 한다.

역 따옴표는 숫자 1왼쪽에 있다. ~밑에 있는 점. 그것이 역 따옴표이다.

다음은 출력 예시이다.

$ echo `l.`
. .. .bash_history .bash_logout .bash_profile .bashrc .gitconfig .oracle_jre_usage .ssh .viminfo .vimrc

다음처럼 명령어가 실행된다.



7. 연산

방법 1
result=`expr 1 + 1`

1. 연산부를 역따옴표로 묶는다.
2. 연산자와 숫자 또는 숫자형 변수 사이에는 반드시 공백이 있어야 한다.
3. 괄호와 *, / 사용시에는 앞에 \(역슬래쉬)를 반드시 적어줘야 한다.

방법 2
result=$((산술식))

이 방법은 역 슬래쉬를 적지 않아도 됨.



8. 조건문과 조건식

조건문은 다음과 같은 형태를 가진다.

if 조건식
    then 명령어
    elif 조건식
        then 명령어
    else
        명령어
fi

then 다음에 명령어는 조건문이 참일 시에 실행될 문장이고.
만약 거짓일 시에 elif뒤에 조건문을 검사한후 참일 시에 그 하단에 then의 명령어를 실행한다.
만약 이도 거짓일 경우 else 하단에 명령어를 실행하게 된다.

참고로 쉘에서 세미콜론(;)은 개행을 의미한다.

이를 이용하여
if 조건식; then
    명령어
elif 조건식; then
    명령어
else
    명령어

다음과 같이 정리하여서 작성할 수도 있으니 본인 스타일대로 작성하도록 하자.


조건문에 들어가는 조건식은 다음과 같이 작성한다.

[ 조건식 ]

조건식의 좌우에는 반드시 공백이 들어가야 한다. 꼭!


수치 비교
-eq : x와 y의 값이 같은 경우
-ne : x와 y의 값이 다른 경우
-gt : x가 y보다 큰 경우
-lt : x가 y보다 작은 경우
-ge : x가 y보다 크거나 같을 경우
-le : x가 y보다 작거나 같을 경우

파일 비교
-a : 파일이 존재하는 경우
-e : 파일이 존재하는 경우
-b : 파일이 존재하고 블록 장치 파일인 경우
-c : 파일이 존재하고 캐릭터 장치 파일인 경우
-f : 파일이 존재하고 정규 파일()인 경우
-s : file이 존재하면서 크기가 0 보다 큰 경우
-L : 심볼릭 링크인지 체그
-h : 심볼릭 링크인지 체크

-d : 폴더인 경우
-f : 폴더가 아닌 파일인 경우

-o : 파일이 존재하고 자신의 소유 일 경우
-r : 파일이 존재하고 읽기가 가능한 경우
-w : 파일이 존재하고 쓰기가 가능한 경우
-x : 파일이 존재하고 실행 가능한 경우
-u : 파일이 존재하고 SetUID가 설정된 경우
-g : 파일이 존재하고 SetGID가 설정된 경우
-k : 파일이 존재하고 Sticky bit가 설정된 경우
! -옵션 : 옵션 내용이 거짓인 경우

문자열 비교
-z 문자열 : 문자열의 길이가 0인 경우
-n 문자열 : 문자열의 길이가 0이 아닌 경우
문자열=문자열 : 일치하는 경우
문자열!=문자열 : 일치하지 않는 경우
문자열 : 문자열이 NULL이 아닌 경우

추가 보완되어야 할 사항에 대해서 건의를 주시면 반영하도록 하겠습니다.