반응형

쉘 스크립트를 작성하다 보면 함수를 사용해서 반복적인 일들을 수행 하면 좋을 경우가 있습니다. 다른 프로그램 언어와 마찬가지로 쉘 스크립트 역시 함수를 지원하고 이를 통해 수많은 기능 구현이 가능합니다.

 

그럼 선언하는 방법을 비롯해 가장 기초적인 상황에 대해서 알아보도록 하겠습니다.

 

 #!/bin/bash

 #함수선언 및 정의

 func ()

 {

   수행문

 }

 

 func

 

문법 형식은 다음과 같습니다.

 

C언어를 기준으로 비교할 때 큰 부분은 비슷하지만 몇가지 차이점이 있습니다. 먼저, 쉘 스크립트에서는 함수를 따로 선언하고 사용할 수가 없고 선언과 동시에 정의를 해야 하고 스크립트의 상단에 먼저 배치해서 사용해야 됩니다. 이 부분의 인터프리터 언어에서 나오게 되는 한계점이라고 생각하시면 될거 같습니다.

 

그리고 함수를 선언할 때 타입을 지정해야 할 필요가 없으며 사용할 때는 함수의 이름으로 만 사용이 가능합니다. 그럼 간단한 샘플 코드를 통해 마무리를 하도록 하겠습니다.

 

 #!/bin/bash

func()
{
        echo func $1 $2 $3
}

echo "CALL func()"
func "hello" "World" "WoW"

root@ubuntu:/shell# ./func.sh
CALL func()
func hello World WoW

 

샘플 코드에는 Argument 값도 추가로 넣어서 해보았습니다. 이렇게 Argument를 이용할 경우에는 다양한 인풋값을 함수로 보내서 보다 기능을 다양하게 사용할 수 있습니다.

 

 

#!/bin/bash

func()
{
        echo func $1 $2 $3
        return 100
}

echo "CALL func()"
func "hello" "World" "WoW"
echo "func return value : $?"

root@ubuntu:/shell# ./func.sh
CALL func()
func hello World WoW
func return value : 100

 

마지막으로 함수 리턴값을 활용하는 방법을 알아보겠습니다.

다른 여타 프로그램과 마찬가지로 return 으로 넘길 수 있으며 바로 뒤에 $? 예약어로 결과를 받을 수 있습니다. 여기서 중요한 점은 함수 바로 뒤에서 $?을 활용해야되며 이후 다른 명령어를 활용하게 되면 해당 명령어의 return 값을 들고 온다는 점 유의 바랍니다.

반응형
반응형

쉘 스크립트를 작성할 때 다양한 환경변수(예약어)를 사용하게 되면 보다 스크립트를 깔끔하게 사용할 수 있어서 전부는 아니더라도 제가 많이 사용한 것을 위주로 한번 정리하도록하겠습니다.

 

$0~n : 일반적으로 사용할 때는 입력받은 파라미터를 의미하고 함수에 사용할 경우 함수의 파라미터를 의미

($0 은 현재 쉘스크립트 이름이거나 함수의 이름)

 

$$ : 쉘의 PID

 

$# : 파라미터의 개수

 

$@ : 파라미터 목록

 

$* : 명령어의 모든 인수 목록

 

$? : 바로 직전에 수행한 결과의 리턴값

 

$! : 백그라운드 프로세스 PID -> 이부분은 추후 추가 설명

 

$PWD : 현재 디렉토리의 절대경로명

 

$USER : 현재 사용자 이름

 

$UID : 현재 사용자의 UID

 

$PATH : 명령어 검색 경로

 

$SHELL : 로그인 쉘의 절대 경로

 

$TERM : 터미널 종류의 이름

 

$RANDOM : (bash, csh) 1~65535까지의 랜덤의 정수

 

 

이밖에도 여러가지만 있지만... 여기까지 정리하도록 하겠습니다

 

반응형
반응형

쉘 스크립트를 사용하다 보면 사용자 입력을 받아야 되는 경우가 많습니다.

 

그 때 보다 세련되고 있어??? 보이게 끔 받을 수 있는 방법을 소개하고자 합니다.

 

getopt라는 명령어 인데 먼저 ... 샘플코드를 보도록 하죠

 

 #!/bin/bash

## 도움말 출력하는 함수
help() {
        echo "splt [OPTIONS] FILE"
                echo "    -h         도움말 출력."
                echo "    -a ARG     인자를 받는 opt."
                echo "    -b ARG     인자를 받는 opt2."
                exit 0
}
while getopts "a:b:h" opt
do
case $opt in
a) arg_a=$OPTARG
echo "Arg A: $arg_a"
;;
b) arg_b=$OPTARG
echo "Arg B: $arg_b"
echo "$arg_b"
;;
h) help ;;
?) help ;;
esac
done

 

getopt를 사용하는 이유는

 

1. 다양한 입력 값이 존재할 경우 사용자와 개발자의 편의를 보장하기 위함 이고

2. 스크립트를 보다 체계적으로 관리할 수 있기 때문입니다.

 

가장 중요한 부분은 아래의 구분인데

 

while getopts "a:b:h" opt

보통 다음과 같은 형식을 주로 사용하고 getopt는 첫번째 파라미터로 옵션으로 사용될 문자열을 입력 받고 다음에는 옵션으로 활용되는 변수를 사용합니다.

 

getopt를 사용할 때 주의해야 할 점은 ":" 입니다. 기존적으로 getopt는 한개의 문자만을 구분자로 사용하며 사용할 문자열 뒤에 ":"을 붙이게 되면 뒤에 Value가 붙게 된다는 것을 의미합니다

 

스크립트 실행 결과는 다음과 같습니다

 

root@ubuntu:/shell# ./getopt.sh -a hello
Arg A: hello

root@ubuntu:/shell# ./getopt.sh -b hi
Arg B: hi
hi

root@ubuntu:/shell# ./getopt.sh -h
splt [OPTIONS] FILE
    -h         도움말 출력.
    -a ARG     인자를 받는 opt.
    -b ARG     인자를 받는 opt2. 

 

 

 

반응형
반응형

분기문의 한종류인 switch-case 문에 대해서 알아보고자 합니다.

 

 case $VAR in

    $CASE1)

           수행문1

           ;;

    $CASE2)

           수행문2

           ;;

    $CASE3)

           수행문3

           ;;

    *)

           수행문4

 esac

 

다음과 같은 형식으로 사용이 되는점을 확인해주시고 간단한 샘플 코드로 마무리하도록 하겠습니다.

 

#!/bin/bash

echo "Enter a number between 1 and 10. "
read NUM

case $NUM in
1) echo "one" ;;
2) echo "two" ;;
3) echo "three" ;;
4) echo "four" ;;
5) echo "five" ;;
6) echo "six" ;;
7) echo "seven" ;;
8) echo "eight" ;;
9) echo "nine" ;;
10) echo "ten" ;;
*) echo "INVALID NUMBER!" ;;
esac 

 root@ubuntu:/shell# ./switch.sh
Enter a number between 1 and 10.
10
ten

 

 

반응형
반응형

쉘 스크립트에서 사용하는 while 문에 대해 알아보도록 하겠습니다 .

 

기본적인 형식은 다음과 같습니다.

 

 while [ 조건문 ]

 do

 

   수행문

 

 done

 

간단하게 설명을 하면 for문과의 차이점은 소괄호 대신 대괄호를 쓴다는 점과 앞에 설명한 조건문을 while에 사용한다는 점이 있습니다.

 

그리고 수행문안에 break를 넣어 특정조건이 발생했을때 loop를 벗어날수도 있습니다.

 

그럼 2가지의 예제를 보도록 하겠습니다

 

 

  #!/bin/bash

  i=1


  while [ $i -le 5 ]

  do

        echo $i

        i=$(($i+1))

 done

 root@ubuntu:/shell# ./while.sh
 1
 2
 3
 4
 5

 

 

  #!/bin/bash

  i=1

 
  while [ $i -le 5 ]

  do

    echo $i

    i=$(($i+1))
    if [ $i -eq 3 ]
    then
        break
    fi

  done

 root@ubuntu:/shell# ./while_break.sh
  1
  2

 

 

 

반응형
반응형

쉘 스크립트에서 반복문으로 많이 사용하는 for문에 대해서도 알아보겠습니다.

 

for문은 크게 2가지 형태로 사용됩니다.

 

 < 1형식 >

 for (( i=0 ; 조건문 ; 증감식 ))

 do

    수행문

 done

  < 2형식 >

 for i in  '1' '2' ...

 do

    수행문

 done

 

1형식은 흔히 C, C++에서 사용하는 형식이고 2형식은 JAVA, C# 같은 언어 에서 사용하는 형식입니다. 필요할 때 필요한 방법을 사용하면 될거 같습니다. 1형식은 숫자를 일정한 규칙에 의해 증가시키거나 반복 시킬때 유용하고 2형식은 불규칙한 규칙 (문자열 등등)을 사용할 경우 유용합니다.

 

그럼 샘플 코드를 통해 결과를 보도록 하겠습니다.

 

< 1형식 >

 #/bin/bash

for (( i=0;i<10;i++ ))
do
        echo "i = $i"
done

 root@ubuntu:/shell# ./for_1.sh
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9

 

< 2형식 >

 

 #/bin/bash

for string in "cat" "dog" "caw"
do
        echo "string = $string"
done

 root@ubuntu:/shell# ./for_2.sh
string = cat
string = dog
string = caw

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts