정의
컴파일 같은 작업이 필요 없이 텍스트 파일 안의 명령 프롬프트에서 실행 가능한 명령들을 적고, 이 파일에 실행권한을 줘서 마치 하나의 프로그램이 작동하는 것과 같은 기능을 수행.
장점
- 쉽고 빠르게 작성할 수 있다.
- 기존의 프로그램들과 명령어들을 함께 연결해서 재사용 가능하다.
vi 에디터를 이용한 편집

- source 이용 : 인수로 주어지는 파일을 읽어 현재 수행 중인 셸 환경 안에서 실행시켜주는 명령어
- 점 '.' : 점과 파일명은 한 칸 띄워야 한다.

sh 혹은 bash 를 직접 구동하여 실행

이 외에도 chmod 명령을 통해 파일에 실행 권한을 부여하고 실행시키는 등의 방법이 있다.
- #! 의 형식을 이용한다.
- 작성된 셸 스크립트가 어떠한 시스템에서도 정확하게 작동되도록 하는 좋은 이식성을 위해 표현
- 매직 넘버를 지정하지 않으면 시스템의 기본 셸로 실행된다.
- 아래와 같이 작성한다.
#! /bin/bash
#! /bin/bash
# Print "Hello World" using variable
STR="Hello World"
echo $STR
4행에서 echo명령을 이용해 변수에 있는 값을 출력하였는데, 변수를 사용할 때는 위 예제처럼 $ 기호를 사용해야 한다.
리눅스는 대소문자를 철저하게 구분하며. echo를 Echo라고 입력하면 에러가 발생하고
$와 변수명 사이에 공백이 없어야 한다.
#! /bin/bash
# Single quotation mark .vs. Double quotation mark
STR_A="Hello World"
STR_B="Hi Linux"
echo "Double quotation mark string STR_A : $STR_A"
echo "Double quotation mark string STR_B : $STR_B"
echo 'Single quotation mark string STR_A : $STR_A'
echo 'Single quotation mark string STR_B : $STR_B'

Single quotaion은 입력된 값을 그대로 출력하고 Double quotation은 변수의 값을 출력해줌.
| 변수명 | 의미 |
|---|---|
| $$ | 프로세스의 PID |
| $? | 최근 실행한 명령의 종료 값 |
| $0 | 프로그램 명 |
| $1 | 프로그램에 전달된 첫 번째 인수 |
| $* | 프로그램에 전달된 인수 전체(하나의 문자열로 취급) |
| $@ | 전달인수를 문자열의 목록으로 표시함(각각의 문자열로 취급) |
| $# | 프로그램에 전달된 인수의 개수 |
| $! | 마지막으로 실행된 백그라운드 프로세스의 PID |
#! /bin/bash
# Using bash builtin variable especially position parameter
echo "$0 : $1 $2 $3 $4"
echo "$0 process id is $$"
echo "$0 has $# variable"
echo "$0 variable total string $*"
echo "$0 variable list $@"

#! /bin/bash
# Using bash built in variable especially position parameter
echo -n "Input value : "
read a
echo "You entered $a"
정의
간단한 프로그램 언어로써 가져야 하는 제어구조를 표현
조건문과 반복문이 있다.
흐름제어 구문
| 키워드 | 의미 |
|---|---|
| if, else | 조건의 참, 거짓을 구분해서 실행 |
| for | 정해진 횟수만큼 반복 |
| while | 조건이 참인 동안 반복 |
| until | 조건이 참일 때까지 반복 |
| case | 변수의 값에 따라 해당하는 구문을 선택하고 실행 |
| select | 사용자에게 메뉴를 제시하고 선태할 수 있도록 함. |
여러가지 조건을 검사하여 참, 거짓의 결과에 따라 수행여부를 결정한다.
if [조건 1]
then
실행 문장 1;
elif [조건 2]
then
실행 문장 2;
else
실행 문장 3;
fi
elif와 else는 선택사항이다.
| 연산자 | 의 미 |
|---|---|
| -lt | 보다 작음(less than) |
| -le | 작거나 같음(less or equal) |
| -eq | 같음(equal) |
| -ge | 크거나 같음(greater equal) |
| -gt | 큼(greater than) |
| -ne | 같지 않음(not equal) |
#! /bin/bash
# If statement use integer compare operator
echo -n " Input integer A "; read INT_A
echo -n " Input integer B "; read INT_B
# INT_A와 INT_B가 같지 않다면
if [ $INT_A -ne $INT_B ]
then
echo "INT_A($INT_A) is not equal to INT_B($INT_B)"
fi
# INT_A 와 INT_B가 같다면
if [ $INT_A -eq $INT_B ]
then
echo "INT_A($INT_A) is equal to INT_B($INT_B)"
fi
# INT_A 가 INT_B보다 작다면
if [ $INT_A -lt $INT_B ]
then
echo "INT_A($INT_A) is less than INT_B($INT_B)"
fi
# INT_A가 INT_B보다 크다면
if [ $INT_A -gt $INT_B ]
then
echo "INT_A($INT_A) is greater than INT_B($INT_B)"
fi
# INT_A가 INT_B보다 작거나 같다면
if [ $INT_A -le $INT_B ]
then
echo "INT_A($INT_A) is less than INT_B($INT_B) or equal"
fi
# INT_A가 INT_B보다 크거나 같다면
if [ $INT_A -ge $INT_B ]
then
echo "INT_A($INT_A) is greater than INT_B($INT_B) or equl"
fi

| 연산자 | 의미 |
|---|---|
| str1 = str2 | 문자열이 서로 일치함 |
| str1 != str2 | 문자열이 일치하지 않음 |
| -n str | str이 NULL이 아님. 길이가 0보다 큼 |
| -z str | str이 NULL임 길이가 0 |
#! /bin/bash
# If statement use string compare operator
echo -n "Input string A : "; read STR_A
echo -n "Input string B : "; read STR_B
#STR_A의 길이가 0이거나 NULL이라면
if [ -z $STR_A ] ; then
echo “String STR_A is NULL”
echo “ Input string to STR_A. $0 scripts exit!”
exit
fi
#STR_B의 길이가 0이거나 NULL이라면
if [ -z $STR_B ] ; then
echo “String STR_B is NULL”
echo “ Input string to STR_B. $0 scripts exit!”
exit
fi
#쉘 스크립트에서는 괄호문자 앞에 역 슬래시 \ 를 붙여 줘야하낟.
## -n 옵션을 통해 STR_A와 STR_B가 널이 아님을 확인
if [ \( -n $STR_A \) –a \( -n $STR_B \) ] ; then
#STR_A와 STR_B가 널이 아니라면 값이 같은지 확인
if [ $STR_A = $STR_B ] ; then
echo “STR_A is equal to STR_B”
else
echo “STR_A is not equal to STR_B”
fi
fi
if문에 사용된 -a 는 and 연산을 의미한다
(or는 -o)
변수의 값을 각각의 case값과 비교해 프로그램을 분기시킬 때 사용
중첩되는 if문은 보통 잘 정리된 case문으로 대체한다.
가독성이 더 좋기 때문
case 변수명 in
문자열1)
문장 1 ;;
문자열2)
문장2 ;;
*)
문장3 ;;
esac
일반적인 프로그래밍 언어에서 switch case문은 각 분기의 끝을 break로 알리지만 shell에선 ;; 으로 알리며
esac (case 거꾸로 쓴 것)으로 case문을 종료해줘야 한다.
#! /bin/bash
# Using "case" statement
echo -n "Are you boy?(Type Y or N) : " read ans
case $ans in
y|Y)
echo "You are lucky boy";;
n|N)
echo "You are lucky girl";;
*)
echo "Type Y or N";;
esac
횟수나 범위를 지정하여 수행할 문장을 반복수행한다.
시작 전에 미리 반복 횟수 확정 혹은 변수 값의 목록을 미리 생성in, do, done 키워드가 필요하다.
for 변수명 in 변수값1 변수값2 변수값3
do
문장
done
변수값1을 변수에 대입하고 문장을 수행한 다음 변수값2를 변수에 대입하고 문장을 수행함.
차례로 변수값3을 변수에 대입하고 문장을 수행
#! /bin/bash
# Using "for" statement
for var in A B C D E
do
echo "var's value : $var"
done
주어진 조건을 만족하는 동안 반복
조건이 항상 참이면 무한루프에 빠진다.
while[조건]
do
문장
done
#! /bin/bash
# Using "while" statement
x=1
echo -n "Input integer : " ; read y
while[$y -gt 0]
do
echo -n "$x."
echo "Hello World"
x=$((x+1));y=$((y-1))
done
while 문과 반대로 주어진 조건이 거짓인 동안 반복
조건이 항상 거짓이면 무한루프
until[조건]
do
문장
done
#! /bin/bash
# Using "until" statement
until [ "$A"="q" -o "$A"="Q" ]
do
echo -n "Input string(If you want to exit, type q or Q) : "
read A
echo "Input string : $A"
done
지정된 인수를 문자열이 아닌 수식으로 인식해 수학적 연산을 수행하게 한다.
일반적인 수식 연산자를 그대로 사용함

#! /bin/bash
# Using "expr" command
ans=`expr 1 + 2 + 3`
echo " 1 + 2 + 3 = $ans"
ans=`expr \(1+2\) \* 3 + 4`
echo " ( 1 + 2 ) * 3 + 4 = $ans"
수식을 둘러싸고 있는건 Single Quatation ( ' )이 아니고
BackStick( ` ) 이다.
수식 계산에서 괄호나 *에는 (역슬래시)를 붙여줘야한다.
셸에서 역슬래시는 특수문자를 문자 그대로 인식하게 하는 기능을 한다.
