본문 바로가기

OS의 속삭임/Linux의 외침

[OS][LINUX][SHELL]쉘 스크립트

* 쉘 스크립트

- 명령어들을 연속적으로 실행하는 인터피리터 환경 제공

- 제어문과 변수 선언 등이 가능한 프로그래밍 언어와 유사 

- 프로그래밍 언어와 스크립트 언어

- 프로그래밍 언어

- 대부분 소스 코드를 컴파일 하여 실행 가능한 파일로 만들어짐

- 일반적으로 실행 파일은 다른 운영체제로 이식되지 않음

- 스크립트 언어

- 컴파일 과정이 없고 인터프리터가 소스 파일에 명령문을 판독 하여 각각의 명령을 수행

- 쉴스크립트의 기본 

- 쉘스크립트 언어

- 일반적으로 '.sh'라는 확장자를 가짐

#!/bin/bash

echo 'Hello Linux'

#!/bin/bash는 해당 스크립트를 실행 하기 위한 쉘의 경로

- 실행 권한을 부여하고 './파일명'로 수행한다.

- 리다이렉션 

- 표준입력을 파일로 지정 : < 또는 << 사용

- 표준출력을 파일로 지정 : > 또는 >> 사용

- 포준에러 파일로 지정

- 예> grep abc * 2> grep_errors.txt

- 표준출력을 표준에러로 보내기 

- 예> grep abc * 1>&2


* 변수

- 환경변수 

- 초기 설정에 대한 정보를 저장하는 변수

- 특수 변수

- 쉘프로그램에 전달 됨, 명령 행 인수 등

- ${?}, ${인수번호} 등

- 예 : ls -l ${1} > ~/mydir.txt

- 프로그램 변수

- 쉘 스크립트의 변수는 필요 시 선언 하여 사용할 수 있음

- 변수의 데이터 타입(숫자, 문자, 문자열)을 정할 필요 없음

- 값 설정

- 변수 = 값

#!/bin/bash

STR="Have a good day!"

echo $STR


* 조건문

- if문

if [조건]; then

[문장]

...

fi


- if-else문

if [조건1]; then

[문장1]

..

..

else 

[문장2]

...

...

fi



- if- else if

if [조건1]; then

[문장1]

...

...

elif [조건2]; then

[문장2]

...

...

else 

[문장3]

...

...

fi


- 비교연산

- A -eq B : A=B

- A -ne B : A!=B

- A -gt B : A > B

- A -lt B : A < B

- A -ge B : A >= B

- A -le B : A <= B

- 문자열 비교 

- string1 = stirng2 => string1과 string2가 같음 (또는 ==)

- ex 1) if [ $1 = hi ]

- ex 2) if test $1 == "hi"

- string1 != string2 : string1과 string2가 같지 않음

- ex) if [ $1 != 'bye' ]

- string : string이 정의 되어 있고 NULL 이 아님

- ex) if [ $1 ]

- -z string : string이 정의 되어있지 않거나 null임

- ex) if [ -z string ]

- 파일 조건 

- -e file : file 이 존재함

- -f file : file 이 존재하며 일반 파일이고 디렉터리가 아님.

- -d dir : dir 이 존재하며 디렉터리임.

- -r (또는 w,x) file : file이 존재하며 읽기(또는 쓰기, 실행) 가능

- 논리 연산

- !표현식 : NOT

- 표현식1 -a 표현식2 : AND

- 표현식1 -o 표현식2 : OR

- 특수문자

- 따옴표의 의미

- '...' : 안의 내용을 해석 하지 않음(\문자 제외)

shell>echo '"$PATH"'

"$PATH"

- "..." : 안의 특수문자를 일반 문자로 취급 $,\,`등의 문자는 해석함.

shell>echo "'$PATH'"

'이런저런환경변수값 --;;;'

- `...` 또는 $(...) : 안의 내용을 실행(`..`는 가독성이 썰어져 $(...)가 권장됨

shell>echo "Today is `date`"

Today is 현재시간출력

shell>echo $(expr 3\*7)

21

- 연산자

- 산술연산자

- +,-,*,/,% : 더하기 , 빼기, 곱하기, 나누기, 나머지

sum=$(expr $a + $b)

mul=$(expr $a \* $b)

mod='expr $a % $b'

- 논리 연산자

- !, &&, || : NOT, AND, OR

- if [ $# -gt 0 -a $# -lt 4 ] 의 결과는 if [ $# -gt 0 ] && [ $# -lt 4 ]와 같다. 

* 순환문

- do ~ done 사이의 구문을 지정한 조건만큼 반복 

- 순환문의 종류 : for, while, until

- for문

- 각 원소에 대해 구문을 수행

for 변수 in list1 list2 list3 또는 for ((초기값; 조건; 증가식))

do 

문장

...

done

#!/bin/bash

if [ $# eq 0 ]

then

echo "Usage: $0 integer_number"

else 

# for num in 1 2 3 4 5 6 7 8 9 와 같음

for ((num=1; num<=9; num++ ))

do 

echo " $1 * $num = `expr $1 \* $num `"

done

fi

- while 문

- 조건이 참인 동안 구문을 수행

while 조건

do

문장들

...

done

#!/bin/bash

if [$# -eq 0]; then

echo "Usage: $0 integer_number"

else

num=1

while [ $num -le 9 ]

do 

echo "$1 * $num = $(expr $1 \* $num)"

num="expr $num+1"

done

fi


- Until 문

- 조건이 거짓인 동안 수행

until 조건

do 

문장들

...

done


* 함수 

- 함수

- 특정한 일을 수행 하는 기능이 구현 된 코드 블록 

- 함수 정의

function 함수명{

문장들 

...

}

- 함수 호출

- 함수명 또는 함수명 인자들

#!/bin/bash

function mult()

{

for ((i=1;i<=9;i++))

do

echo "$1 * $i = `expr $1 \* $i`"

done

}


if [$# -eq 0]; then

for ((num=1; num<9; num++))

do

mult $num

done

else

mult $1

fi


* 디버깅

- 쉘 스크립트의 첫번째 행에 -x를 추가한다.

- #!/bin/bash -x

- 실행 과정을 자세히 보여줌