다잇소


[IT/트랜드] [보경샘 IT 이야기] Shell Programming ② – Script 만들기

2016.05.23
보경샘프로그래밍

1.Shell Script실행하기


  1. 명령창에서 script




멋지고장황한 shell script 만드는 것은 시작은 간단한 script일 것 입니다누구나 Programming를 배우면서 가장 많이 다루고가장 많이 만들어 프로그램은 Hello World일 것 입니다우리도 예외 없이 가장 먼저 만드는 script는 Hello World입니다화면에 Hello World를 표시를 echo라는 명령어를 이용하여 만들어 보겠습니다.










bkpark@[/data/download]$ echo Hello World


Hello World



방금은 명령어 하나만 이용했지만이제 시간을 나타내어 보겠습니다


Hello World at 현재 시간으로 말입니다.










bkpark@[/data/download]$ echo Hello World at; date


Hello World at


2016. 05. 19. () 06:39:39 KST



원하는 시간까지 나왔지만웬지 2줄로 나오니 보기가 안 좋습니다이것을 한 줄로 만들어 보겠습니다.










bkpark@[/data/download]$ DATE=`date`;echo Hello World at $DATE


Hello World at 2016. 05. 19. () 06:41:46 KST



이제 한 줄로 나오니 보기가 좋습니다이렇게 한 줄로 나타내기 위해서 우리는 변수 $DATE, “ ` “와 “;”를 사용하였습니다우리는 echo라는 명령어만 처음에 사용하였지만, 2번째는 “;”를 이용하여 2개의 명령어를 한꺼번에 실행하는 script를 작성하였습니다마지막으로는 한줄로 표시 하려고, DATE변수와 “ ` ’를 사용하여 명령어 date결과를 변수에 담고이를 명령어 echo 에서 $DATE를 이용하여 생성된 변수를 이용하였습니다좀 더 복잡한 script를 만들어 낸 것 입니다그렇지만명령어창에서는 환경변수 255자 제한 때문에 필요한 만큼의 스크립트를 작성 할 수 없습니다. 또 하나의 단점은 몇 번 명령어창에서 이렇게 입력해야 한다는 것 입니다재사용 하려면 우리는 이를 파일로 작성하여저장하고실행을 해야 합니다





  1. 스크립트 실행




위에서 작성한 명령창에 명령어들을 이용하여 스크립트 파일을 직접 작성 해 보겠습니다파일을 작성을 하려면 편집기를 사용해야 하는데많은 분들은 vi(gvim)를 사용하여 편집하는 것을 선호 할 것입니다그렇지만, vi(gvim)에 익숙하지 않은 분들은 현재 사용하는 배포판 Ubuntu는 gedit라편집기가 기본으로 설치되어 있습니다기능은 notepad보다 많으나그 수준을 벗어나지 못 합니다. Ultraedit와 같이 강력한 기능을 원하다면 Kwrite Edit를 추천합니다https://kate-editor.org/라는 사이트에서 내려받기 할 수 있습니다편집기를 이용하여 이제 편집하여 저장하겠습니다.










bkpark@[~/bash_util/study]$ cat helloworld.sh


#!/bin/bash


DATE=`date`;echo Hello World at $DATE



첫줄에 #!로 시작하여 /bin/sh로 시작하는 부분은 이 스크립트를 실행하는 어떠한 shell로 실행할 것인가를 표시하는 것 입니다. /bin/bash 로 이 스크립트를 실행한다는 의미 입니다그렇지만처음 파일을 생성한 경우는 실행이 가능하 파일이 아닙니다










bkpark@[~/bash_util/study]$ ll helloworld*


-rw-r–r– 1 bkpark bkpark 38 5월 20 06:30 helloworld2.sh


-rw-r–r– 1 bkpark bkpark 50 5월 20 06:33 helloworld.sh



현재 읽기쓰기만 가능하고 실행이 불가능합니다파일이 생성될 때 기본으로 생성되는 권한은 umask에 의해 영향을 받습니다. umask에 대해서는 자세히 다루지 않고, rw-r–r–(644)형태로 생성이 되려면 umask값이 022로 설정이 되어 있어야 합니다. umask값이 000이라면 rw-rw-rw(666)로 생성이 됩니다.


실행 권한이 없지만, shell를 실행할 수 있는 방법이 있습니다


일반적인 방법은 shell명령 실행하는 것 입니다아래와 같이 직접 sh + 스크립트파일명을 입력하여 실행 할 수 있습니다.










bkpark@[~/bash_util/study]$ sh helloworld.sh


Hello World at 2016. 05. 20. () 06:40:13 KST



다른 방법은 source라는 명령어를 이용하여 실행하는 방법입니다. Bash shell에서는 source라는 명령어 .으로 built-in되어 있어, source대신 .으로 실행이 가능합니다.










bkpark@[~/bash_util/study]$ source helloworld.sh


Hello World at 2016. 05. 20. () 06:42:28 KST


bkpark@[~/bash_util/study]$ . helloworld.sh


Hello World at 2016. 05. 20. () 06:42:36 KST



그렇지만여전히 우리가 원하는 방법이 아닙니다여기에 실행 권한을 주어서 실행하는 방법이 가장 일반적입니다.


chmod u+x 스크립트파일 이용하여 다음과 같이 실행 권한을 주는 것 입니다.










bkpark@[~/bash_util/study]$ chmod u+x helloworld.sh


bkpark@[~/bash_util/study]$ ll helloworld*


-rw-r–r– 1 bkpark bkpark 38 5월 20 06:30 helloworld2.sh


-rwxr–r– 1 bkpark bkpark 50 5월 20 06:33 helloworld.sh*


bkpark@[~/bash_util/study]$ helloworld.sh


Hello World at 2016. 05. 20. () 06:44:46 KST


bkpark@[~/bash_util/study]$



스크립트 실행 시에 경로를 전체를 입력하지 않고스크립트 파일명만 입력 후에 실행을 하였는데 이는 환경변수 $PATH와 관련이 있습니다전체 경로 없이 실행하려면bash파일 위치가 $PATH에 포함되거나, $PATH에 .(현재위치)포함이 되고현재 위치에 스크립트 파일이 있으면 가능합니다.










bkpark@[~/bash_util/study]$ echo $PATH


/home/bkpark/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:.



2.변수 다루기




  1. 변수 생성하기




shell script에서 변수 생성 하는 방법은 “변수명=값” 입니다주의할 점은 “=” 사이에 빈 공간이 없어야 하고최대길이는 20자까지 지원합니다그리고문자숫자와 underscore를 사용 할 수 있습니다문자열에 공백이 있는 경우는 “ 나 ’ 로 감싸 주어야 합니다값에 따라 자동적으로 자료형의 결정이 됩니다문자열 변수를 산술연산 시도에 오류가 나거나 산술연산의 값이 올바르지 않습니다.


– 선언 변수명=










bkpark@[~/bash_util/study]$ cat test01.sh


#!/bin/bash


#!/bin/bash


str1=Hello


str2=”Hello World”


num1=1


num2=5


echo str1 is $str1


echo str2 is $str2


echo “[ num1 + num2 ] is” $[ $num1 + $num2 ]


echo “[ str1 + num2 ] is” $[ $str1 + $num2 ]


echo “[ str2 + num2 ] is” $[ $str2 + $num2 ]


bkpark@[~/bash_util/study]$ test01.sh


str1 is Hello


str2 is Hello World


[ num1 + num2 ] is 6


[ str1 + num2 ] is 5


./test01.sh: line 12: Hello World + 5 : syntax error in expression (error token is “World + 5 “)


6


./test01.sh: line 8: Hello World + 5 : syntax error in expression (error token is “World + 5 “)



이와 같이 생성된 변수는 지역변수(Local Variable)생성이 됩니다이를 전역변수(Global Variable)변경하려면 export를 사용하여 변경 할 수 있습니다전역변수가 되면 자식 프로세스에서 사용이 가능합니다즉 같은 터미널에서 사용되는 모든 명령어에서 사용이 가능 해 집니다선언방법은 변수선언 다음에 export 변수나 export 변수=할당 두 가지 방식으로 할 수 있습니다다음을 예제를 살펴 보기 바랍니다


– 선언 방법 1) 변수1=1,변수2=2


export 변수변수2


방법 2) export 변수1=변수2=2










bkpark@[~/bash_util/study]$ cat test02.sh


#!/bin/bash


str1=”Hello World”


export str2=Hello


echo “str1 is a local variable.”


./test03.sh


echo “str1 is a global variable.”


export str1


./test03.sh


bkpark@[~/bash_util/study]$ cat test03.sh


#!/bin/bash


echo “str1 is $str1”


echo “str2 is $str2”


bkpark@[~/bash_util/study]$ test02.sh


str1 is a local variable.


str1 is


str2 is Hello


str1 is a global variable.


str1 is Hello World


str2 is Hello





  1. 변수 사용하기




변수를 사용하려면예제에서 이미 보았듯이 $를 변수명 앞에 사용하여 합니다일반적인 경우는 $만 붙어서 사용이 가능하지만매개변수 처리 시에는 문제가 정상적으로 잘 처리 되는 듯 보이지만, 10개 이상의 매개변수일 경우는 예상과 다른 결과가 나옵니다.










bkpark@[~/bash_util/study]$ cat test04.sh


echo “Param 1 is ” $1


echo “Param 10 is ” $10


bkpark@[~/bash_util/study]$ test04.sh first second third fourth fifth sixth seventh eighth ninth tenth


Param 1 is first


Param 10 is first0



잘 나오는 듯 하지만다시 첫번째 매개변수를 출력을 합니다이 문제를 해결을 하려면 {}를 감싸면정상적으로 10번째 매개변수를 출력을 합니다.










bkpark@[~/bash_util/study]$ cat test04.sh


echo “Param 1 is ” $1


echo “Param 10 is ” ${10}


bkpark@[~/bash_util/study]$ test04.sh first second third fourth fifth sixth seventh eighth ninth tenth


Param 1 is first


Param 10 is tenth



이 방법은 매개변수뿐만 아니라 ${str1}, ${1}으로 가능합니다. {}는 변수명을 지정할 때 사용할 수 있습니다.


$는 변수를 사용할 때 변수명 앞으로 나와 변수임을 알립니다그렇지만, $는 문자로 사용해야 할 경우가 발생합니다그런 경우는 우리는 escape문자인 \를 사용하여 $를 사용할 수 있습니다다음 예제를 살펴보도록 하겠습니다.










bkpark@[~/bash_util/study]$ cat test05.sh


#!/bin/bash


money1=5; money2=10


echo $5 + $10 is $$[ $money1 + $money2 ]


bkpark@[~/bash_util/study]$ test05.sh


+ 0 is 23884[ 5 + 10 ]



원하는 결과 전혀 다름 결과가 보입니다이것 5번째 와 첫번째 매개변수를 출력하고프로세스 ID를 출력하고 있습니다올바른 결과를 만들려면, \를 $앞에 추가 하겠습니다.










bkpark@[~/bash_util/study]$ cat test05.sh


#!/bin/bash


money1=5; money2=10


echo \$5 + \$10 is \$$[ $money1 + $money2 ]


bkpark@[~/bash_util/study]$ test05.sh


$5 + $10 is $15



\를 출력할 때 역시 \\처럼 escape문자인 \를 사용하여 출력이 가능합니다.



3.Shell 종료하기 


프로그램을 종료 할 시에 프로그램의 종료 상태를 shell에 반환할 수 있습니다. Shell 스크립트 마찬가지로 shell의 종료 상태를 부모 shell에 반환 할 수 있습니다이 반환값은 0~255 사이에 값으로 반환 할 수 있는데반환 값이 0일 경우는 정상의 의미 합니다정상이 0이다는 것은 중요한 의미를 갖습니다. test(조건)에서 0일 경우 참으로 처리합니다. 일반적으로프로그래밍에서는 0은 거짓을 의미하지만, shell 프로그래밍에서는 0이 참을 뜻합니다이 반환 값은 변수 $?에 설정이 됩니다반환 값은 exit number형식으로 설정 할 수 있습니다.


다음 예제를 살펴보면우선 실행 후에 정상적으로 끝내고 반환 값을 주지 않는 경우 입니다.










bkpark@[~/bash_util/study]$ cat helloworld.sh


#!/bin/bash


DATE=`date`;echo Hello World at $DATE


bkpark@[~/bash_util/study]$ helloworld.sh


Hello World at 2016. 05. 22. () 07:53:51 KST


bkpark@[~/bash_util/study]$ echo $?


0



두번 째는실행 후에 정상적으로 끝내고 반환 값을 임의로 주겠습니다.










bkpark@[~/bash_util/study]$ cat helloworld2.sh


DATE=`date`;echo Hello World at $DATE


exit 100


bkpark@[~/bash_util/study]$ helloworld2.sh


Hello World at 2016. 05. 22. () 07:57:46 KST


bkpark@[~/bash_util/study]$ echo $?


100



exit 100인 경우 반환 값이 100입니다확인 해 보니 100으로 나타납니다.


반환 값을 원하는 값을 0에서 255에서 원하는 숫자로 설정 할 수 있으나아래 숫자들의 시스템에서 사용 용도가 정해져 있으니피하는 것이 좋습니다.




















































숫자



용도



설명



1



모든 일반적인 오류 



0이 피젯수 경우처럼 기타 일반적인 오류



2



Shell 내부 함수 사용 오류



shell내부에서 잃어버린 키워드명령어 또는 권한 문제가 발생한 경우 .



126



명령어를 실행 할 수 없는 경우



명령어 권한 문제나명령어가 실행 불가능한 경우



127



명령어를 발견할 수 없는 경우



$PATH안에 명령어가 없는 경우



128



잘못된 반환값으로 종료하는 경우



Exit 3.14처럼 정수값으로 반환하지 않는 경우



128+n



치명적인 오류 표시(127+n)



프로그램에서 사용



130



Control+C로 종료되는 경우



255*



반환 값이 0~255를 벗어나는 경우



exit -1처럼 반환값 범위를 벗어나는 경우



다음 예제를 살펴 보겠습니다.










bkpark@[~/bash_util/study]$ ps z


error: unsupported option (BSD syntax)



For more details see ps(1).


bkpark@[~/bash_util/study]$ echo $?


1


bkpark@[~/bash_util/study]$ test06.sh


bash: ./test06.sh: Permission denied


bkpark@[~/bash_util/study]$ echo $?


126


bkpark@[~/bash_util/study]$ wrongcmd


wrongcmd: command not found


bkpark@[~/bash_util/study]$ echo $?


127


bkpark@[~/bash_util/study]$ cat helloworld2.sh


date


exit -1


bkpark@[~/bash_util/study]$ helloworld2.sh


2016. 05. 22. () 08:25:59 KST


bkpark@[~/bash_util/study]$ echo $?


255



이와 같이 특정 반환 값은 용도가 정해 져 있습니다이상으로 shell programming두번째 마치겠습니다다음 강좌는 입출력산술 연산그리고, shell programming시에 유용한 명령어를 알아 보겠습니다.

설정된 프로필 사진이 없습니다.
| Wise리더
관심분야 IT,여행,맛집

카테고리 레이어 닫기