Shell Programming

Shell Programming

Shell Programming

  • 리눅스의 셸 스크립트는 C언어와 유사한 방법으로 프로그래밍 할 수 있음
  • 셸 스크립트 파일의 확장자는 sh
  • 최상단에는 #!/bin/sh 를 추가 -> 셔뱅: bash 셸을사용하겠다는 의미
  • #으로 시작하면 주석이지만 #!는 주석이 아님

스크립트 파일 실행 방법

  • sh 스크립트 파일경로 - 읽기 권한만 있으면 실행
  • 스크립트 파일의 경로 - 현재 디렉터리에 있는 경우 ./ 를 추가해서 경로를 작성, 실행 권한 필요
./test.sh
sh test.sh

변수

  • 기본적으로 변수에 넣는 값은 전부 문자열로 취급
  • 변수 이름은 대소문자 구분
  • 데이터 대입시 = 좌우에 공백 없어야
  • 값에 공백이 있는 경우는 ““로 묶어 줘야
  • $가 들어간 내용 출력시 “로 묶어주거나 \ 붙여줘야

계산식 사용

  • 백틱 안의 expr로 시작해서 작성
  • 수식에 괄호를 사용하거나 곱하기인 *를 사용힐 때는 \ 를 붙여야
    n=`expr 100 + 200`
    n=`expr 100 \* 300`
    echo $n

파라미터 설정

  • 실행할 때 같이 넘겨주는 데이터
  • 파라미터를 사용할 때는 $파라미터위치
  • $0은 파일명
  vi param.sh
  1 #! /bin/sh$
  2 echo "$0 $1 $2"$
  3 echo "$2"$

  chmod 775 param.sh

제어문

if

if [ 표현식 ]
then
    참일 때 수행할 내용
else
    거짓일 때 수행할 내용
fi
파일 경로 조건
  -d 파일경로: 디렉터리이면 참
  -e 파일경로: 존재하면 참
  -f 파일경로: 일반 파일이면 참
  -g 파일경로: setGID가 설정되면 참
  -r 파일경로: 읽기 가능이면참
  -s 파일경로: 크기가 0이 아니면 참
  -u 파일경로: setUID가 설정되면 참
  -w 파일경로: 쓰기 가능이면 참
  -x 파일경로: 실행 가능이면 참d
  • /lib/systemd/system/cron.service 라는 파일의 존재 여부를 확인해서 존재하면 존재한다고 않다고 메시지 출력
  1 #! /bin/sh
  2 if [ -f /lib/systemd/system/cron.service ]
  3 then
  4   echo Hello World
  5 else
  6   "No FILE"
  7 fi

case - esac

  • 값으로 분기
  • 형식
    case 데이터 in
    )
              값일 때 수행할 내용
    )
              값일 때 수행할 내용
          *)  
              나머지 경우 수행할 내용
    esac
    • case 구문에 각 값 안에서 여러 개의 실행문을 작성할 수 있기 때문에 내용을 작성할 때 마지막에 ;; 를 추가해줘야함
    • 여러 개의 값에 동일한 내용을 수행하고자 하는 경우는 값 | 값 형태로 작성
#! /bin/sh

case "$1" in
s | S | start)
  echo "HI";;
e)
  echo "E";;
*)
  echo "NO OHTER";;
esac

and, or

  • and - &&, -a
  • or - ||, -o
  • if [조건] && [조건] 의 형태로 입력
  • lib/systemd/system/cron.service 가 있고 홈 디렉터리에 if.sh파일이 있다면 성공 그렇지 않다면 실패라고 출력
    #! /bin/sh
    if [ -f /lib/systemd/system/cron.service ] && [ -f ~/if.sh ]
    then
        echo "success"
    else
        echo "fail"
    fi

for ~ in

  • 형식
    for 임시변수 in 데이터나열
    do
        데이터를 임시변수에 하나씩 대입하고 수행할 문장
    done
    for i in 1 2 3 4 5
    do
        hap=`expr $hap + $i`
    done
    echo $hap
  • 현대 디렉터리의 모든 txt 파일을 읽어서 내용을 출력
    for fname in $(ls *.txt)
    do
        cat $fname
    done

while

  • 표현식이 거짓이 될 때까지 반복
  • 형식
    while [표현식]
    do
        표현식이 거짓이 아니면 수행할 내용
    done
  • 1부터 5까지의 합
    hap=0
    i=1
    while [ $i -le 5 ]
    do
        hap=`expr $hap + $i`
        i=`expr $i + 1`
    done
    echo "Total: $hap"

기타 제어문

  • break, for 나 while을 강제로 중단하고자 할 때 사용
  • until: 반복문
  • continue: for나 while의 시작 부분으로 이동
  • exit: 프로그램 완전히 종료, 상위 프로세스에게 넘겨줄 정수를 같이 사용 exit 0
  • return: 함수를 호출한 곳으로 돌아가는 제어 명령

Function

  • 자주 사용하는 구문을 묶어서 하나의 이름으로 사용하는 것
  • 메모리를 별도로 할당 받아서 사용

생성

이름(매개변수 나열){
    함수 내용
    return
}

호출

  • 함수이름(매개변수)
  • 매개변수가 없는 경우 이름만으로 호출 가능
myfunc () {
  echo "My Function"
  return
}
myfunc
exit 0

eval

  • 문자열을 명령으로 수행
  • 파이썬이나 자바스크립트에서 이 함수가 문자열을 데이터로 치환
    ls -l
    eval "ls -l"