캠핑과 개발

1. shell script의 시작

shell script의 시작은 다음으로 시작한다.

!#/bin/sh

 

2. 문자열 출력

문자열의 출력은 다음과 같다.

echo "hello" #자동 줄바꿈
printf "hello" #c언어와 비슷

 

3. 주석

주석은 #으로 시작합니다.

# 이것은 주석입니다.
function {
 #주석입니다.
 ehco "hello"
}

 

4. 변수의 선언

쉘 스크립트에서 변수명은 대소문자 구분하지 않는다.

기본적으로 전역변수이며 변수 앞에 local을 붙여서 지역변수로 사용할 수 있다..

변수명과 값은 "="로 구분하며, 공백 없이 변수명=값으로 지정한다. 

기본적으로 변수명에 할당된 값음 모두 문자열로 인식한다.

선언된 변수는 해당 스크립트에서만 유효하며 다른 쉘 스크립트에서도 사용하려면 export를 붙여서 환경변수로 만들어야 한다.

변수의 해제는 unset로 한다.

 

아래의 예제에서 var1, var2는 모두 문자열로 인식한다.

var1=1
var2="1"

 

할당된 변수를 사용하기 위해서는 $, ${변수명}를 사용하여 할당된 변수를 사용한다.

var=1
echo $var

 

${변수명}을 사용할 경우에는 변수에 담긴 값에 연산을 이용할 수 있다.

사용법 설명
${변수명:위치} 위치 다음부터 문자열 추출
${변수명:위치:길이} 위치 다음부터 지정한 길이만큼 문자열 추출
${변수명:-기본값} 변수가 값이 없을 경우 기본값 지정
${변수명:?값} 변수의 값이 없을 경우 값출력 후 스크립트 종료
${변수명?값} 변수 미선언시에 값 출력 후 스크립트 종료
${#변수명} 문자열 길이

 

#!/bin/bash

value="abcdef"
echo ${#value} #변수값의 길이 출력
#result=>6

echo ${value:2} #특정 위치부터 출력
#result=> cdef

echo ${value:2:2} #특정 위치부터 길이만큼 출력
#result=>cd

# null이면 입력값 초기화 후 출력, 아니면 변수값 출력
echo ${value=ghijkl} 
echo ${value2=ghijkl}
#result=>abcde
#result=>ghijkl

#null이 아니면 입력값 출력, 아니면 빈값 출력
echo ${value+ghijkl}
echo ${value2+ghijkl}
#result=>ghijkl
#result=>

#null이면 입력값 출력, 아니면 변수값 출력
echo ${value-ghijkl}
echo ${value2-ghijkl}
#result=>abcdef
#result=>ghijkl

#null이면 오류, 아니면 변수값 출력
echo ${value?ghijkl}
echo ${value2?ghijkl}
#result=>abcdef
#result=>./test.sh line x: value: ghijkl

변수는 특수 매개변수를 제공한다.

  • $$ : 현재 스크립트의 PID
  • $? : 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태
  • $! : 최근에 실행한 백그라운드(비동기) 명령의 PID
  • $- : 현재 옵션 플래그
  • $_ : 지난 명령의 마지막 인자로 설정된 특수 변수

 

만약 할당된 변수를 숫자로 사용하고 싶다면 expr 명령어를 사용한다.

또 다른 방법은 $(()) 감싸고 계산 하는 방법이 있다. $(()) 계산식 안에 있는 숫자들은 문자열이 아니라 숫자로 연산이 된다.

var1=1
var2="2"
echo `expr $var1 + $var2`
echo $(($var1 + $var2))

 

 

 

5. 배열의 선언

쉘 스크립트는 1차원 배열만 사용한다. 배열을 선언할 때는 인덱스가 연결되지 않아도 되며 배열의 선은은 다음과 같다.

#!/bin/bash

#배열에 값 할당
array[0]="1"
array[1]="2"
array[2]="3"

#한번에 배열 선언
array=("1", "2", "3")

#배열의 값 사용
echo ${array[0]}

#배열 전체 길이 출력 : ${#array[@]}

#전체 출력 : ${array[@]}

#배열의 복사 
array=(${array[@]} "2")

 

6. 파라메터 전달

쉘을 수행할때 파라메터를 던져 줄 수 있다.

쉘을 수행할때 파라메터는 /test.sh 123 456 678 형태로 넘겨줄 수 있으며 수행되는 쉘 안에서는 $1 ~$9 형태로 받을 수 있다. 10번째 인자부터는 ${}로 감싸줘야 한다. 넘겨받은 인자는 몇가지 형태가 있으며 다음과 같다.

 

  • $0 : 실행된 스크립트명
  • $1~n : 넘겨받은 인자의 순서의 넘어온 값 $1, $2 ... $9 ... ${10}, ${11}....
  • $* : 전체 인자 값
  • $@ : 전체 인자 값
  • $# : 매개 변수의 총 갯수

7. 커맨드

  • 쉘 스크립트에서는 $(리눅스 명령어)의 결과인 표준 출력을 문자열로 치환한다.
  • 물론 변수에 할당도 가능하다. ex. today=$(date)

 

8. 따옴표

쉘 스크립트에서는 쌍따옴표(Double Quotation), 따옴표(Single Quotation), 역따옴표(Backquote)가 모두 다르다.

 

  • 쌍따옴표는 특수기호가 동작하는 문자열이다.

  • 작은 따옴표는 특수기호를 그대로 출력한다.

  • 역따옴표는 명령을 실행한 후 결과를 반환하는 따옴표이다.

#!/bin/bash

var1="hello"
var2="world"
var3="!!!"

echo "${var1} ${var2} ${var4}"
#result=> hello world !!!

echo '${var1} ${var2} ${var4}'
#result=> ${var1} ${var2} ${var4}


total=`free | grep Mem | awk '{print $2}'`

  문자에서 특수문자를 사용하기 위해서는 다음과 같이 한다.

쌍따옴표 "\""
'"'
쌍따옴표는 특수기호를 작성할 때 역슬러시를 이용
따옴표는 특수기로를 그대로 출력
따옴표 "'" 따옴표는 표기할 방법이 없음
역실러시 "\\"
'\'
역슬러시도 역슬러시로 표시할 수 있다.
따옴표는 특수기호를 그대로 출력