셸 스크립트 프로그래밍

한준수·2023년 6월 22일

Linux

목록 보기
9/10

📖 셸 스크립트란?

  • 정의

    컴파일 같은 작업이 필요 없이 텍스트 파일 안의 명령 프롬프트에서 실행 가능한 명령들을 적고, 이 파일에 실행권한을 줘서 마치 하나의 프로그램이 작동하는 것과 같은 기능을 수행.

  • 장점

    • 쉽고 빠르게 작성할 수 있다.
    • 기존의 프로그램들과 명령어들을 함께 연결해서 재사용 가능하다.

📌 셸 스크립트 작성

- 작성방법

vi 에디터를 이용한 편집

⌨ 예시

📌 셸 스크립트의 실행

- 실행명령어 이용

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

⌨ 예시

- 기본 셸 호출 명령어 이용

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

⌨ 예시

이 외에도 chmod 명령을 통해 파일에 실행 권한을 부여하고 실행시키는 등의 방법이 있다.


📖 매직 넘버(Magic Number)

📌 셸 스크립트에서 이용하는 셸의 지정

  • #! 의 형식을 이용한다.
  • 작성된 셸 스크립트가 어떠한 시스템에서도 정확하게 작동되도록 하는 좋은 이식성을 위해 표현
  • 매직 넘버를 지정하지 않으면 시스템의 기본 셸로 실행된다.
  • 아래와 같이 작성한다.
#! /bin/bash  

📖 변수

📌 형식

  • 데이터 타입(숫자, 문자 등) 선언이 필요 없다.
  • 변수가 필요할 때 선언해서 사용가능하며, 미리 선언할 필요가 없다.

📌 변수의 선언과 활용(sample_var.sh)

#! /bin/bash
# Print "Hello World" using variable
STR="Hello World"
echo $STR

4행에서 echo명령을 이용해 변수에 있는 값을 출력하였는데, 변수를 사용할 때는 위 예제처럼 $ 기호를 사용해야 한다.
리눅스는 대소문자를 철저하게 구분하며. echo를 Echo라고 입력하면 에러가 발생하고
$와 변수명 사이에 공백이 없어야 한다.

⌨ 인용부호의 활용(sample_quo.sh)

#! /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은 변수의 값을 출력해줌.

📌 내장 변수

  • 셸 스크립트 프로그래밍에 이용되는 미리 지정되어 있는 변수
  • 읽기 전용으로 스크립트 내에서 값의 변경 불가
  • 위치 매개 변수 : $1, $2 등으로 표시되는 값

✍ bash 셸의 내장 변수

변수명 의미
$$ 프로세스의 PID
$? 최근 실행한 명령의 종료 값
$0 프로그램 명
$1 프로그램에 전달된 첫 번째 인수
$* 프로그램에 전달된 인수 전체(하나의 문자열로 취급)
$@ 전달인수를 문자열의 목록으로 표시함(각각의 문자열로 취급)
$# 프로그램에 전달된 인수의 개수
$! 마지막으로 실행된 백그라운드 프로세스의 PID

⌨ 내장변수의 활용(bash_var.sh)

#! /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 $@"

💻 출력결과

⌨ read 명령의 활용(sample_read.sh)

#! /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문

여러가지 조건을 검사하여 참, 거짓의 결과에 따라 수행여부를 결정한다.

  • 형식
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)

⌨ if문 활용 예제_정수

#! /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

⌨ if문 활용 예제_문자열

#! /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 문

변수의 값을 각각의 case값과 비교해 프로그램을 분기시킬 때 사용

중첩되는 if문은 보통 잘 정리된 case문으로 대체한다.
가독성이 더 좋기 때문

  • 형식
case 변수명 in
문자열1)
	문장 1 ;;
문자열2)
	문장2 ;;
*)
	문장3 ;;
esac

📌 주의점

일반적인 프로그래밍 언어에서 switch case문은 각 분기의 끝을 break로 알리지만 shell에선 ;; 으로 알리며
esac (case 거꾸로 쓴 것)으로 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

💻 출력 결과


📖 for 문

횟수나 범위를 지정하여 수행할 문장을 반복수행한다.
시작 전에 미리 반복 횟수 확정 혹은 변수 값의 목록을 미리 생성

in, do, done 키워드가 필요하다.

  • 형식
for 변수명 in 변수값1 변수값2 변수값3
do
	문장
done

변수값1을 변수에 대입하고 문장을 수행한 다음 변수값2를 변수에 대입하고 문장을 수행함.
차례로 변수값3을 변수에 대입하고 문장을 수행

⌨ for문 활용 예제

#! /bin/bash
# Using "for" statement
for var in A B C D E
do
	echo "var's value : $var"
done

💻 출력 결과


while 문

주어진 조건을 만족하는 동안 반복
조건이 항상 참이면 무한루프에 빠진다.

  • 형식
while[조건]
do
	문장
done

⌨ while문 활용 예제

#! /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

💻 출력결과


⌨ until 문

while 문과 반대로 주어진 조건이 거짓인 동안 반복

조건이 항상 거짓이면 무한루프

  • 형식
until[조건]
do
	문장
done

⌨ until문 활용 예제

#! /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

📖 수식 계산 - expr

지정된 인수를 문자열이 아닌 수식으로 인식해 수학적 연산을 수행하게 한다.

일반적인 수식 연산자를 그대로 사용함

  • 예시

⌨ expr 활용 예제

#! /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( ` ) 이다.
수식 계산에서 괄호나 *에는 (역슬래시)를 붙여줘야한다.
셸에서 역슬래시는 특수문자를 문자 그대로 인식하게 하는 기능을 한다.

💻 출력결과

0개의 댓글