Raspberry Pi_Kor_20.2.5 script 실행 제어


Published Book on Amazon


All of IOT

Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1

All of IOT

Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2


출판된 한글판 도서


최신 라즈베리파이(Raspberry Pi)로 시작하는 사

물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상)

최신 라즈베리파이(Raspberry Pi)로 시작하는 사

물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하)


Original Book Contents


20.2.5  script 실행 제어

 

20.2.5.1    조건에 따른 선택적인 처리

 

어떤 조건에 따라 명령을 선택적으로 처리하고자 할 때 사용하는 것이 "if" , "case" 문이다

 

   if

 

"if" 문은 지정된 조건식의 결과가 "True"인 경우에 "then" 다음에 지정된 문장들을 실행하고, "False"인 경우는 "elif" 또는 "else" 다음에 지정된 문장들을 실행한다. 기본적인 문법은 다음과 같다.   

 

if         [ 조건식 ]

then

           실행문

elif       [ 조건식 ]

then

           실행문

else 

           실행문

fi

if         [ 조건식 ] ; then

           실행문

elif       [ 조건식 ] ; then

           실행문

else 

           실행문

fi

 


 

조건식에서 "True", "False"를 판단하는 기준 값은 다음과 같다.

    True                      -- 0      -- zero             

    False           -- 1      -- non zero

 

문장은 "if"로 시작해서 "fi"로 끝나며, "elif" "else"는 필요한 경우 선택적으로 사용할 수 있다. 조건식은 앞뒤로 반드시 공백이 있어야 하고 "if" "then"을 같은 줄에 두려면 세미콜론(;)으로 분리해야 한다.  실행문에는 하나 이상의 문장을 지정할 수 있다.

 

"if"에서 지정한 조건식 이외에 다른 여러 개의 조건식을 사용하고자 하면 "elif" 문을 선택적으로 사용할 수 있다. 앞에서 지정된 조건식의 결과가 "False"인 경우에는 다음 "elif" 문을 실행하게 되며, 더 이상 "elif" 문이 없는 경우 "else"가 있으면 해당 명령을 실행하고, 없으면 처리를 종료한다.   

 

[사용 Example]

다음은 입력한 매개변수의 값에 따라서 선택적으로 처리하는 script이다. 내용을 입력한 다음 "/home/pi/Script/test.sh" 파일에 저장한다.

 

#!/bin/bash

if  [ $1 -eq 0 ]; then

           echo "correct number"  $1

else

           echo "wrong number"  $1

fi

 

다음과 같이 위의 script를 실행해 보면 어떻게 선택적으로 처리되는지를 확인할 수 있다.      

 

pi@raspberrypi ~/Script $ ./test.sh 0

correct number 0

pi@raspberrypi ~/Script $ ./test.sh 4

wrong number 4

          


 

   "case"

 

case 문은 변수와 지정된 값에 따라 각각 선택적인 처리를 할 수 있는 문장이다.  

 

case     $변수명   in

           A-value)

                      실행문

                      ;;

           B-value)

                      실행문

                      ;;

           *)

                      실행문

                      ;;

esac

 

이 문장은 "case"로 시작해서 "esac"로 끝나며, "value)" 문은 선택적으로 사용할 수 있다. 사용하고자 하는 "value)" 문의 개수는 제한이 없으며, "*)"는 앞에서 지정한 모든 "value)" 문의 값이 아닌 다른 값을 의미한다. 실행문은 하나 이상의 문장을 지정할 수 있으며 마지막은 항상 ";;"으로 종료해야 한다.

 

변수의 값이 "value)" 문에서 지정된 것과 동일하면, 그 다음에 지정된 문장들을 실행한다. 변수의 값이 앞에서 지정한 "value)"의 값과 다르면, 다음 "value)" 문으로 넘어가며, 일치하는 것이 전혀 없으면, "*)"에서 지정한 문장을 실행하고, 이것도 없으면 처리를 종료한다.   

 


 

[사용 Example]

다음은 case문을 이용하여 script를 실행한 사례이다. 다음과 같은 내용을 입력한 다음 "/home/pi/Script/test_case.sh" 파일에 저장한다.

 

#! /bin/bash

echo "input. Aa/Bb is correct"

read input

case $input  in

Aa)

           echo "OK." $input

           ;;

Bb)

           echo "OK." $input

           ;;

*)

           echo "Error." $input

           ;;

esac

exit 0

 

다음과 같이 script를 실행해 보면 어떻게 선택적으로 처리가 되는지를 확인할 수 있다.

 

pi@raspberrypi ~/Script $ ./test_case.sh

input. AA/BB is correct

AA

OK. AA

pi@raspberrypi ~/Script $ ./test_case.sh

input. AA/BB is correct

AB

Error. AB

 

script를 실행하면 값을 입력하라는 메시지가 나오고, 필요한 값을 입력하고, [Enter] 버튼을 누르면 입력한 값이 따라서 정확한지를 판단하여 결과를 알려준다.

20.2.5.2    반복 처리

 

script에서 동일한 작업을 여러 번 반복하여 처리하고자 할 때 사용할 수 있는 문장이 있는데, "while", "until", "for" 문들이 그러한 것들이다. 이들 문장은 기본적인 처리 내용은 동일하지만, 다만 이들 각각의 문장들은 처리 여부를 결정하는 조건식을 지정하는 방식과 조건식의 결과에 따라 처리 여부를 결정하는 방식만 다를 뿐이다.  

 

 

   "while" 제어문

 

"while" 문은 지정된 조건식의 결과가 "True"일 때 처리를 계속한다.  

 

while  [ 조건식 ];

do

           실행문

done

 

조건식은 앞뒤로 반드시 공백이 있어야 하고 끝에 ";"로 끝나야 한다. 실행문은 "do" -"done" 사이에 있어야 하며, 여러 문장을 지정할 수 있다.

 

조건식의 값이 "True"이면 다음에 지정된 실행문을 처리한다. 실행문의 처리가 완료되면 다시 조건식을 검사하여 처리의 계속 여부를 검사한다. 조건식의 결과가 "False"이면 처리를 종료하고 다음 문장으로 진행한다.

 

[사용 Example]

다음의 script를 작성하여 "home/pi/Script/test_while.sh" 파일에 저장하여 실행할 수 있도록 한다.

 

#! /bin/bash

number =0

while [ number -le 4 ] ;

   do

           echo "number" $number

           number=$(( $number + 1 ))

   done

echo "All is completed"

exit 0

 

다음과 같이 script를 실행해 보면 "number"의 숫자가 증가하면서 "while" 문이 반복해서 실행되고, 그 값이 "4"보다 크면 처리를 종료하는 것을 알 수 있다.

 

pi@raspberrypi ~/Script $ ./test_while.sh

number 0

number 1

number 2

number 3

number 4

All is completed

 

 

   "until" 제어문

 

이 문장은 지정된 조건식의 결과가 "False"인 경우에, 즉 조건식의 결과가 "True"가 될 때까지 처리를 계속하는 문장이다.  

 

until  [ 조건식 ] ;

do

           실행문

done

 

조건식은 앞뒤로 반드시 공백이 있어야 하고 끝에 ";"로 끝나야 한다실행문은 "do" "done" 사이에 있어야 하며, 여러 문장을 지정할 수 있다.

 

조건식의 값이 "False"이면 다음에 지정된 실행문을 처리한다. 실행문의 처리가 완료되면 다시 조건식을 검사하여 처리의 계속 여부를 검사한다. 조건식의 결과가 "True"이면 처리를 종료하고 다음 문장으로 진행한다.

 

[사용 Example]

이것은 앞의 "while" 문에서 사용한 것과 거의 유사한 것이지만, 단지 조건식의 내용만 변경한 것이다.

 

#! /bin/bash

number =0

until [ number -gt 4 ] ;

   do

           echo "number" $number

           number=$(( $number + 1 ))

   done

echo "All is completed"

exit 0

 

다음과 같이 script를 실행해 보면 "number"의 숫자가 증가하면서 "until" 문이 반복해서 실행되고, 그 값이 "4"보다 크면 처리를 종료하는 것을 알 수 있다.

 

pi@raspberrypi ~/Script $ ./test_until.sh

number 0

number 1

number 2

number 3

number 4

All is completed


 

   "for" 제어문

 

이 문장은 어떤 변수의 값이 초기값에서 시작하여 조건식이 True이거나, 또는 변수의 값이 지정된 범위 내에 있는 경우에 처리를 계속하는 문장이다.  

 

for (( 변수초기값; 조건식; 변수증감값 ))           

#          ex) for ((num=1; num<=10; num++))

do

           실행문

done

for 변수 in  seq  초기값 마지막값'                

#          ex) for num in 'seq 1 10'

do

           실행문

done

for 변수 in 1  2  3                      

#          ex) for num in 1 2 3 4 5 6 7 8 9 10

do

           실행문

done

 

여기서 지정하는 값은 반드시 숫자이고, 정수이어야 한다. 증가하는 값은 특별한 지정이 없으면 1 이다. 초기값을 설정할 때는 "="를 사용하고, 조건식을 지정할 때는 "=", ">", ">=", "<", "<=", "<>" 와 같은 연산자를 사용한다. 실행문은 "do" "done" 사이에 있어야 하며, 여러 문장을 지정할 수 있다.

 

초기값에서 시작하여 일단 실행문을 처리하고, 값을 증가하여 처리여부를 판단한다. 증가된 값이 지정된 조건에 맞거나 최종값보다 크지 않으면 처리를 계속하다. 증가된 값이 지정된 조건에 맞지 않거나 최종값보다 크면 처리를 종료한다.


 

[사용 Example]

이것은 앞의 "while" 문에서 사용한 것과 거의 유사한 것이며, 단지 조건식의 내용만 변경한 것이다.

 

#! /bin/bash

for  (( number=0;  number <= 4;  number++  ))

   do

           echo "number" $number

done

echo "All is completed"

exit 0

 

다음과 같이 script를 실행해 보면 "number"의 숫자가 증가하면서 "for" 문이 반복해서 실행되고, 그 값이 "4"보다 크면 처리를 종료하는 것을 알 수 있다.

 

pi@raspberrypi ~/Script $ ./test_for.sh

number 0

number 1

number 2

number 3

number 4

All is completed