본문 바로가기
유닉스, 리눅스

[유닉스/리눅스 기초](배쉬) 쉘 프로그래밍

by TJobim 2016. 9. 13.
반응형

<쉘 스크립트>

  • 스크립트(자바스크립트, 펄스크립트, 우라스크립트, 파이썬...)
    • 컴파일을 통해 실행파일을 만드는 것이 아니라 인터프리터에 의해 실행
    • 컴파일 언어보다 구조가 쉬워 빨리 배울 수 있음
    • 다른 프로그램을 통해 실행되므로 컴파일 언어보다 실행 시간이 오래 걸림
  • 쉘 스크립트 파일 이름은 스크립트 기능 및 어느 쉘인지 알 수 있도록
  • 앨리어스, 내장 명령, 함수 키워드가 실행되지 않도록 파일명 작성
    • 실행 순서 : 앨리어스 -> 키워드 -> 함수 -> 내장명령 -> 스크립트, 유닉스 명령, 유틸리티

 

<쉘 스크립트 실행 / 종료>

  • 권한 부여 후 경로 설정하여 실행
  • 쉘 통해 실행(bash 파일명)
  • 파일내에서 exit (숫자) 명령을 만나면 종료 (숫자는 $?에 저장됨)

 

<스크립트 파일 구성요소>

  • #!(매직넘버) : 현재 스크립트를 처리할 프로그램(인터프리터) 지정(#!/bin/bash, #!/bin/more, ...)
    • 일반적인 유닉스 명령어만 사용한다면 쉘 지정하지 않아도 됨
  • # : 주석문
  • 쉘 명령 : 모든 쉘 명령을 스크립트 내용으로 사용 가ㅡㅇ
  • 쉘 프로그램 : 쉘에서 제공하는 프로그램들
    • 쉘 변수, 각종 연산자, 제어문 등등


<쉘 변수>

  • 변수명=값 : 정의와 동시에 값 저장
    • ${변수명} : 변수명 값으로 대치
    • ${변수명:-문자열} : 변수가 정의되어 있으면 해당 값을, 아니면 문자열을 사용
    • ${변수명:=문자열} : 변수가 정의되지 않았거나 널이면 문자열 사용(변수 값은 문자열로 대체 됨), 그렇지 않으면 대체X
    • $(변수명:+문자열} : 변수가 정의되어 있고 널이 아니면 문자열 사용, 그렇지 않으면 대체 안 됨
    • ${변수명:?문자열} : 변수가 정의되어 있고 널이 아니면 해당 값을, 그렇지 않으면 문자열을 출력하고 쉘 종료
  • 쉘 변수 일부 문자열 제거
    • ${문자열%패턴} : 문자열 뒤부터 패턴과 일치하는 가장 작은 부분 제거
    • ${문자열%%패턴} : 문자열 뒤부터 패턴과 일치하는 가장 큰 부분 제거
      • *을 붙여야 일치하는 최대 부분 제거하기 용이(뒤에 붙은 문자열까지)
    • ${문자열#패턴} : 문자열 앞부터 패턴과 일치하는 가장 작은 부분 제거
    • ${문자열##패턴} : 문자열 앞부터 패턴과 일치하는 가장 큰 부분 제거
      • 마찬가지로 /을 붙이면 마지막에 나오는 파일 이름만 알아낼 수 있음
    • ${#문자열} : 해당 값의 문자 수 출력
  • 포지션 인자
    • 스크립트를 실행할 때 인자를 전달하면 수서대로 주어진 인자를 저장
    • $0 : 현재 쉘 스크립트의 이름
    • $1 ~ $9 : 명령행에서 전달 받은 첫번째 ~ 아홉번째 포지션 인자
    • ${10} : 10번째 포지션 인자
    • $# : 전체 포지션 인자 개수
    • $* : 모든 포지션 인자
    • $@ : $*과 동일
    • "$*" : "$1 $2 $3 ..."을 하나의 문자열로 취급
    • "$@" : "$1" "$2" "$3" ... 으로 각각 독립적인 문자열로 취급
    • $? : 최근 실행된 명령의 종료 값(exit, return을 통해)
    • set -- : 모든 포지션 인자들을 삭제/설정 해제
  • 명령 대체
    • ``(백쿼터) 이외에 $(명령)도 지원함


<사용자에게 입력 받기>

  • read 변수명 : 표준 입력으로 한 행을 입력 받아 변수에 저장
  • read 변수명1 변수명2 : 표준 입력으로 한 행을 입력 받아 첫 번째 단어를 변수1에 나머지를 변수2에 저장
  • read -p 문자열 : 문자열을 프롬프트로 출력시키고 입력 받아 REPLY변수에 저장
  • 명령 << 문자열 : 키보드 입력의 EOF(^D)와 달리 해당 문자열이 나올 때까지의 모든 문자열을 입력으로 처리


<연산자>

  • 수치 연산자(let 내장 명령 또는 (()) 사용)
    • - : 음수(단항 연산) ex: a=-3
    • ! : 논리 부정(not) ex: ((!a>b))
    • ~ : 비트 반전(not) ex: ~a
    • *, /, & : 곱셈, 나눗셈, 나머지 연산 ex: let a=5*2
    • +, - : 덧셈, 뺄셈 ex: let a=4+b
    • <<, >> : 시프트 연산 ex: ((a = b<<1))
    • <=, >=, <, >, ==, != : 비교 연산 ex: ((a == b))
    • &, ^, \ : 비트 and, xor, or 연산 ex: let "a = b^c"
    • &&, || : 논리 and, or 연산 ex: ((a<b || a<c))
    • = : 변수 값 지정 ex: let a=1
    • *=, /=, %=, +=, ==, <<=, >>=, &=, ^=, |= : 단축 연산
  • (())안에서 = 좌우는 공백 가능하지만 let을 쓸땐 ""로 묶어줘야 함


<제어문>

  • if문 : 결과 값이 0일때 명령 실행(결과 값이 0이면 종료 값이 1, 0이 아니면 종료 값이 0이다)
    • if 조건명령
      then
           명령
    <p style="margin-left: 40px;">((elif 조건명령
         명령)
    else
         명령))
    fi</p>
    • 문자열 연산자
      • 문자열 = 패턴 : 서로 일치하는지(=사이에 공백 있어야 함)
      • 문자열==패턴 : 서로 일치하는지
      • 문자열 != 패턴 : 서로 일치하지 않는지(!= 사이에 공백 있어야 함)
      • 문자열 : 문자열이 널이 아닌지
      • -z 문자열 : 문자열의 길이가 0인지
      • -n 문자열 : 문자열의 길이가 0이 아닌지
      • -l 문자열 : 문자열의 길이
      • ex: if [[ $x = [0-9]* ]]


<case 문>

  • case 변수 in
     값1)
          명령;;
     값2)
          명령;;
     *)
          명령;;
    esac
  • 값으로 | 연산자나 특수기호(범위 등등) 지정 가능
  • 일치하는 값이 없으면 *) 부분 실행


<for 문>

  • for 변수 in 리스트
     do
         명령
    done
  • 변수를 리스트의 각 값들로 지정해서 do-done 구간 반복
  • $(< 파일명)을 리스트로 사용해서 외부 파일 참조 가능(단어 한 개씩 처리)
  • 당연히 스크립트 명령행 인자를 리스트로 사용 가능(ex: $*)


<while 문> : 구간이 반복 될때마다 조건명령을 실행해서 종료 값이 0이면 반복

  • while 조건명령
     do
         명령
    done
  • 산술, 비교, 논리 연산자를 이용할때 (()) 또는 let을 사용해서 오류 / 무한 루프 방지(^C로 종료)


<until 문> : 조건명령이 정상 실행될 때까지 반복(while과 반대)

  • untile 조건명령
     do
          명령
     done


<select 문> : 리스트 값들에 순서대로 번호를 붙여 출력함(번호를 입력 받음)

  • select 변수 in 리스트
     do
          명령
     done
  • 선택된 값(숫자)은 REPLY에 저장 되고 해당 명령은 cmd에 저장 됨
  • PS3 값이 사용자 입력을 위한 프롬프트로 사용됨
  • REPLY가 널일 때만 프롬프트(PS3 값)이 출력되므로 계속 출력 시키려면 반복 될때마다 REPLY를 널로 설정해야함(REPLY=)


<continue> : 루프의 처음으로 돌아감

  • 중첩된 루프문의 경우 continue를 포함하고 있는 루프의 처음으로 돌아감


<함수>

  • 스크립트 안에서 정의해 사용할 수 있고, 사용자 초기화 파일에 정의할 수도 있다(명령 처럼 사용).
  • function 함수명
    {
       명령
    }
  • typeset -f : 함수목록 출력
  • 일바 명령 쓰듯이 인자 전달(공백으로 구분, $* 등으로 활용)
  • return 변수 : 함수 종료 값 지정($? 변수에 저장 됨)
    • (ex: return $2)
  • unset -f 함수명 : 함수 삭제


<디버깅>

  • bash -x 함수명 : 스크립트의 각 행이 실행될 때마다 화면에 출력(+로 시작하는게 스크립트의 각 행)
  • trap '명령' DEBUG : trap을 포함한 스크립트를 한 행씩 실행할 때마다 명령 실행(주로 변수 변화 확인)
    • DEBUG시그널을 받을 때마다 명령 실행
    • DEBUG : 스클비트의 명령이 실행 될 때마다 생성되는 시그널


반응형

댓글