10. Shell programming

chelseey·2024년 11월 17일

Shell script

Linux에서 실행 가능한 파일 (Executable file)

Script file

: 명령어와 스크립트 구문으로 구성된 파일

• 일련의 Statement(문장)로 구성 :
명령어(Command) 또는 다른 스크립트 파일 호출 가능,
파일 내 작성된 구문을 차례대로 실행.

• 인터프리터가 필요 :
Script 파일은 인터프리터를 통해 한 줄씩 읽고 실행.

• 첫 번째 줄에 #!pathname 작성 :
#! : 스크립트를 실행할 인터프리터의 경로를 지정.
ex) Bash shell

#!/bin/bash

Shell script의 실행

bash 명령어로 실행

: 실행 권한 없이도 실행 가능.
스크립트를 Bash 인터프리터로 직접 실행.

$ bash script_file

실행 권한 부여 후 실행

  1. 실행 권한 추가
    : 명령어로 스크립트 파일에 실행 권한을 부여.
$ chmod +x script_file
  1. 파일 실행
    : 파일을 직접 실행. (./을 포함하여 경로 지정 필수)
$ ./script_file

Shell script의 Argument

ex)

$ vi argument.sh
#!/bin/bash
echo $1 $2 $3 $4 $0   # 첫 번째 ~ 네 번째 Argument와 스크립트 이름 출력
echo $*               # 모든 Argument 출력
echo $#               # 전달된 Argument 개수 출력

• echo $1 $2 $3 $4 $0
$1, $2, $3, $4는 전달된 값들.
$0은 스크립트 이름인 argument를 출력.

Programming 언어로서의 Shell script

Statement (문장)

Shell Command
• 내부 명령어 (Shell built-in command):
쉘 자체에서 제공하는 기본 명령어. ex) cd, echo, pwd
• 외부 명령어 (Executable file):
실행 가능한 파일로 존재하는 명령어. ex) /bin/ls, /usr/bin/who

Other Script File
: 다른 스크립트를 호출하여 실행하는 형태.

제어 구조

if
: 조건에 따라 명령을 실행하는 구문.

while
: 조건이 참인 동안 반복 실행.

for
: 리스트나 범위에서 반복 실행.

case
: 여러 조건 중 하나를 선택하여 실행.

if statement

if [ 조건 ]
then
    statement
elif [ 조건 ]
then
    statement
else
    statement
fi

첫 번째 조건이 참이면 해당 then 블록 실행.
첫 번째 조건이 거짓이고, elif 조건이 참이면 해당 then 블록 실행.
모든 조건이 거짓이면 else 블록 실행.

조건 연산자

비교 연산자

숫자 비교 연산자

< 주의사항 >
• 연산자 앞뒤에는 반드시 빈칸이 있어야 함. → 구문 오류 발생
• 숫자 비교 연산자는 문자열 비교 연산자와는 다른 방식으로 동작.
: 숫자를 비교할 때는 -eq, -gt 등을 사용,
문자열을 비교할 때는 = 또는 !=를 사용.

File attribute 연산자

: 파일의 존재 여부나 속성을 확인하기 위한 조건 연산자

논리 연산자

: 여러 조건을 결합하거나 논리적으로 평가할 때 사용

예제 #1

NumPrint.sh 라는 파일은 다음 속성을 가짐:
일반 파일
읽기 및 쓰기 권한 있음
실행 권한 없음

예제 #2

if [ $1 -nt $2 ]

$1이 $2보다 "새로운 파일(newer file, 나중에 수정되었음)"인 경우

if [ $1 -ot $2 ]

$1이 $2보다 "오래된 파일(older file, 먼저 수정되었음)"인 경우

if [ -f $1 -a $1 -nt $2 ]

$1이 일반 파일인지 확인 (-f $1) ,
$1이 $2보다 최신인지 확인 (-nt $2)

if [ -f $1 -a $1 -ot $2 ]

$1이 일반 파일인지 확인 (-f $1) ,
$1이 $2보다 오래된 파일인지 확인 (-ot $2)

while statement

• while 루프
: 주어진 조건이 True인 동안 특정 명령(statement)을 반복 실행하는 구조

while [ 조건 ]
do
    statement
done

예제

: 숫자 1~9를 출력

#!/bin/bash

x=1  # 초기 변수 x를 1로 설정

while [ $x -lt 10 ]  # x가 10보다 작을 때 반복 (-lt : 작다)
do
    echo $x         # x의 값을 출력
    let x=$x+1      # x 값을 1 증가
done

• for 루프
: 지정된 값 목록(value1, value2, ...)을 순회하며 각 값에 대해 특정 명령(statement)을 실행하는 구조

for 변수 in value1 value2 ... valueN
do
    statement
done

case statement

case 문
: 특정 변수 값에 따라 여러 명령을 조건부로 실행할 수 있도록 설계된 제어 구조

case $변수 in
    값1) 명령어 ;;
    값2) 명령어 ;;
    ...
    *) 기본 명령어 ;;
esac

예제

: caseTest.sh

#!/bin/bash 
case $1 in
“JIM”) echo Hi Jim ;; 
“TOM”) echo Hi Tom ;; 
*) echo Who are you? ;;
esac

Function

: Bash 스크립트에서 함수를 정의하고 사용하는 방법

function 함수명 {
    statement
    return 결과값  # 선택 사항
}

예제

: fnTest.sh

#!/bin/bash

# foo 함수 정의
function foo {
    echo "foo"
    boo  # boo 함수 호출
}

# boo 함수 정의
function boo {
    echo "boo"
}

# foo 함수 호출
foo

예제 #1

: 주어진 자연수들의 합계(Sum), 평균(Average), 그리고 최대값(Max)을 계산하는 Bash 스크립트

#!/bin/bash
sum=0; avg=0; max=0; num=$#
if [ $# -eq 0 ]
then
    echo "Usage: $0 n1 n2 ..."
    exit 1
fi

# 합계 계산 함수 
function fsum {
    for i in $@
    do
        let sum=$sum+$i
    done
}

# 평균 계산 함수
function favg {
    let avg=$sum/$num
}

# 최대값 계산 함수 
function fmax {
    for i in $@
    do
        if [ $i -gt $max ]
        then
            max=$i
        fi
    done
}

fsum $@
favg
fmax $@

# 메인 코드
echo "Sum = $sum"
echo "Average = $avg"
echo "Max = $max"

예제 #2

: 재귀 함수를 사용하여 팩토리얼(Factorial)을 계산하는 Shell 스크립트

#!/bin/bash

function fact {
    local x=$1  # 현재 입력 값
    let local y=$x-1  # x-1 값 계산
    local z=1  # 기본값 z=1 초기화

    if [ $x -gt 1 ]  # x가 1보다 클 경우 재귀 호출
    then
        fact $y  # fact 함수 재귀 호출
        let z=$x*$?  # 재귀 호출 결과값에 현재 x를 곱함
    fi

    return $z  # 계산된 z 값을 반환
}

fact $1  # 사용자가 입력한 값으로 fact 호출
echo "$1! = $?"  # 결과 출력

0개의 댓글