명령줄 인수

스크립트 파일을 실행시키는 시점에서 인수를 전달하여 실행하기

directory=/tmp
sources="${directory} $1"
target=$2

실행 시 다음과 같은 형식으로 명령어를 실행한다.

어쩌고.sh /var/log api.log

위와 같이 인수를 여러개 이상(대게 3개 이상)일 경우 명령어를 실행하기 전에 순서에 신경쓰게 되고 많아질수록 헷갈려하기 쉽다. 때문에 이를 옵션값을 이용하여 인자값을 넘길수 있도록 할수있다.

while getopts b:n: OPT  ## b,n은 옵션으로 사용할 이름
do
  case $OPT in
    b) base="$OPTARG" ;; ## -b 인자값으로 받은 값을 base변수에서 사용
  	n) next="$OPTARG" ;; ## -n 인자값으로 받은 값을 next변수에서 사용
  esac
done

조건에 따라 처리 흐름 바꾸기

인수 개수에 따른 처리 흐름 바꾸기

if [$# = 2]  #   '$#'은 스크립트에 지정한 인수 개수
then
  echo "Hello!"
fi

옵션의 존재 유무로 조건 분기

while getopts b: OPT  ## b,n은 옵션으로 사용할 이름
do
  case $OPT in
    b) base="$OPTARG" ;; ## -b 인자값으로 받은 값을 base변수에서 사용
  esac
done

if [ "$base" != ""]
then
  echo "base variable is empty"
fi

인자값으로 조건 분기

if [ "$base" = "/var/log"]
then
  echo "good"
fi

명령어 이상 종료

$? 는 이전 명령어의 종료 상태를 말한다. $?의 값이 0이라는 것은 정상 종료라는 것을 뜻한다.

반복 실행

./create-report.sh api.log

./create-report.sh front.log

./create-report.sh admin.log

위의 명령어들을 아래와 같은 반복문을 활용하여 실행가능하다.

for filename in api.log front.log admin.log
do
  ./create-report.sh $filename
done

반복문에서는 다음과 같이 명령어의 실행 결과로도 사용할 수 있다.

for filename in 'cd /var/log; ls *.log | grep -v error.log'

셸 함수

main(){
	hello mo
	hello kim
}

hello(){
  echo "$1 하이"
  echo "바이"
}

main

마치며

  • 추상화를 잘하면 쉘스크립트의 힘을 100퍼 활용할 수 있다.