bash shell cheat sheet

KDH·2021년 12월 5일
0

test 커맨드

  • test expression
    • true/false 를 계산하는 표현식
  • file expression
    • file1 -ef file2 : inode가 같은지
    • file1 -nt file2 : file1이 file2 보다 새것인지
    • file1 -ot file2 : file1이 file2 보다 오래되었는지
    • -b file : block-special file
    • -c file : character-special file
    • -d file : directory
    • -e file : exists
    • -f file : regular file
    • -g file : group-ID 가 set 되어있는지
    • -G file : effective group ID를 소유했는지
    • -k file : stick bit 가 set 되어있는지
    • -L file : symbolic link
    • -O file : effecitve user ID를 소유했는지
    • -p file : named pipe
    • -r file : readable
    • -s file : size가 0보다 큰지
    • -S file : network socket
    • -t fd : file descriptor 인지
    • -u file : setuid
    • -w file : writable
    • -x file : executable
  • test String 표현식
    • string : null이 아닌지
    • -n string : 길이가 0보다 큰지
    • -z string : 길이가 0 인지
    • string1 = string2 : equal
    • string1 == string2 : equal (POSIX compliant는 아님)
    • string1 != string2 : 다른지
    • string1 > string2 : 정렬하면 string2이 나오고 string1이 나오는지
    • string1 < string2 : 정렬하면 string1이 먼저 나오는지
  • test Integer 표현식
    • integer1 -eq integer2
    • integer1 -ne integer2
    • integer1 -le integer2
    • integer1 -lt integer2
    • integer1 -ge integer2
    • integer1 -gt integer2
  • Modern test
    • [[ expression ]]
      • string expression이 추가 됨
        • string1 =~ regex
    • (( )) : integer 계산에 사용 됨

bash 매개 변수

위치 매개 변수 (Positional Parameters)

  • $0 : 실행된 스크립트 이름
  • $1 : $1 $2 $3...${10}인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함
  • $* : 전체 인자 값
  • $@ : 전체 인자 값($* 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과 나옴)
  • $# : 매개 변수 총 개수
#!/bin/bash
# posit-params3: script to demonstrate $* and $@
print_params () {
 echo "\$1 = $1"
 echo "\$2 = $2"
 echo "\$3 = $3"
 echo "\$4 = $4"
}
pass_params () {
 echo -e "\n" '$* :'; print_params $*
 echo -e "\n" '"$*" :'; print_params "$*"
 echo -e "\n" '$@ :'; print_params $@
 echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "words with spaces"

posit-param3
 $* :
 $1 = word
 $2 = words
 $3 = with
 $4 = spaces
 
 "$*" :
$1 = word words with spaces
$2 =
$3 =
$4 =

 $@ :
$1 = word
$2 = words
$3 = with
$4 = spaces

 "$@" :
$1 = word
$2 = words with spaces
$3 =
$4 =

특수 매개 변수 (Special Parameters)

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

매개 변수 확장 (Parameter Expansion)

  • string="abc-efg-123-abc"
  • ${변수} : $변수 와 동일하지만 {} 사용해야지만 동작하는 것들이 있음(예: echo ${string})
  • ${변수:위치} : 위치 다음부터 문자열 추출(예: echo ${string:4})
  • ${변수:위치:길이} : 위치 다음부터 지정한 길이 만큼의 문자열 추출(예: echo ${string:4:3})
  • ${변수:-단어} : 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가(예: echo $string:-HELLO})
  • ${변수-단어} : 변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가(예: echo $string-HELLO})
  • ${변수:=단어} : 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능, 변수에 값 설정이 안되어 있는 경우 단어로 설정 됨(예: echo ${string:=HELLO})
  • ${변수=단어} : 변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능(예: echo ${string=HELLO}
  • ${변수:?단어} : 변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료(예: echo ${string:?HELLO})
  • ${변수?단어} : 변수 미선언시만 단어 출력 후 스크립트 종료(예: echo ${string?HELLO})
  • ${변수:+단어} : 변수 선언시만 단어 사용(예: echo ${string:+HELLO})
  • ${번수+단어} : 변수 선언 혹은 NULL일때 단어 사용(예: echo ${string+HELLO})
  • ${#변수} : 문자열 길이(예: echo ${#string})
  • ${변수#단어} : 변수의 앞부분부터 짧게 일치한 단어 삭제(예: echo ${string#a*b})
  • ${변수##단어} : 변수의 앞부분부터 길게 일치한 단어 삭제(예: echo ${string##a*b})
  • ${변수%단어} : 변수의 뒷부분부터 짧게 일치한 단어 삭제(예: echo ${string%b*c})
  • ${변수%%단어} : 변수의 뒷부분부터 길게 일치한 단어 삭제(예: echo ${string%%b*c})
  • ${변수/찾는단어/변경단어} : 처음 일치한 단어를 변경(예: echo ${string/abc/HELLO})
  • ${변수//찾는단어/변경단어} : 일치하는 모든 단어를 변경(예: echo ${string//abc/HELLO})
  • ${변수/#찾는단어/변경단어} : 앞부분이 일치하면 변경(예: echo ${string/#abc/HELLO})
  • ${변수/%찾는단어/변경단어} : 뒷부분이 일치하면 변경(예: echo ${string/%abc/HELLO})
  • ${!단어*}, ${!단어@} : 선언된 변수중에서 단어가 포함된 변수 명 추출(예: echo ${!string*}, echo ${!string@})

lower or uppercase conversion

  • declare -l 변수 or declare -u 변수
    • declare를 사용해서 변수에 소문자 또는 대문자로 저장
  • ${parameter,,pattern}
    • parameter의 글자를 모두 소문자로 변경, 옵션으로 특정 pattern이 매칭 되는 것만 변경
  • ${parameter,pattern}
    • 첫 글자만 소문자로 변경
  • ${parameter^^pattern}
    • 모든 글자를 대문자로 변경
  • ${parameter^pattern}
    • 첫 글자만 대문자로 변경

shift command

  • shift 명령으로 인자를 왼쪽으로 민다
    • $1=a $2=b 에서 $1=b 가 된다.

Quoting (인용)

  • ' ' : 뒤에 오는 모든 특수문자를 일반 문자로 인식 (모든 특수 문자 쿼팅)
  • " " : " " 사이에 들어있는 모든 특수 문자를 일반 문자로 인식
    • $()와 ` `(명령어 대체 특수문자), $ (변수 값 대체 특수문자), \ (quotation 특수문자) 등은 예외
  • \ : 특수문자 바로 앞에 사용되는데 해당 특수문자의 효과를 없애고 일반 문자처럼 처리
  • ` ` : 역 따옴표는 따옴표 안에 있는 명령문의 실행하여 실행결과를 대입

괄호

  • () : 함수 인수의 시작과 끝, 서브 쉘 작성, 배열 초기화
  • (()) : 산술 연산에 사용
  • {} : 명령 블록의 시작과 끝, 각종 변수의 존재범위도 연관됨, 매개변수 확장, 반복되는 문자열 목록 작성, 변수를 명확하게 식별
  • [] : 배열 인덱스, 테스트 조건을 정의
  • [[]] : 기본적으로 단일 대괄호와 동일한 기능을 수행하지만 bash 내장

수식

  • [] : 정수 연산만 기능
var1=$[1 + 2]
var2=$[$var1*2]
  • (( )) :
x=3; y=4
z=$((x+y))
  • let
x=3; y=4
let z=$x+$y
  • expr : 숫자와 연산자 사이를 띄어써야 함
x=3; y=4
expr $x + $y
  • awk
x=3; y=4
echo $x $y | awk '{print $1+$2}'

let 연산자

  • + , - ,/ , * : 사칙연산
  • ** : exponentiation
  • % : mod
  • 나머지 연산자 c언어와 동일해서 생략

Loop

  • while commands; do commands; done
  • until commands; do commands; done
    • until은 조건이 while과 반대
  • for
    for variable [in words]; do
    	commands
    done
  • for: c language form
    for (( expression1; expression2; expression3 )); do
    	commands
    done

case command

case word in
	[pattern [| pattern]...) commands ;;]...
esac
  • pattern 예시
    • a) : word가 a인지
    • [[:alpha:]] : word가 alphabet으로 이루어졌는지
    • ???) : word가 문자 세개인지
    • *.txt) : .txt 로 끝나는지
    • *) : 어떠 한 값도 매칭
  • 계속 검사를 수행하려면 ;;& 를 사용

기타

basename / dirname

  • 파일명과 경로가 있는 문자열에서 파일명만 출력(basename), 경로만 출력(dirname)
    • basename path/file -> output : file
    • basename -a path1/file1 path1/file2 -> output : file1 file2
      • -a 여러 경로의 파일명 출력
    • basename -s path/file.so -> output : file.so
      • -s 확장자를 명시
    • dirname path/file -> output : path

script debugging

  • -x 옵션 사용
    • !/bin/bash -x 로 사용하거나
    • script 에서 set -x 으로 tracing을 키고 set +x 로 tracing을 끈다.
  • PS4 : tracing 출력시 prompt
    • export PS4='$LINENO + ' : 라인 넘버까지 출력 가능

참고

0개의 댓글