command-name &>file
: 명령의 표준 출력과 표준 에러를 모두 file로 지정cat textfile.txt > somefile 2>&1
: 표준 출력은 somefile로 지정되고 표준에러도 표준출력(핸재 somefile)로 함께 보낸다.$1
, $2
, … : 셸 스크립트 인자 순서대로$#
: 셸 스크립트 인자의 총 갯수$*
$@
$?
: 직전 명령 exit code. 0
이면 정상 종료.$-
: 현재 shell 의 설정H
: histexpandm
: monitorh
: hashallB
: braceexpandi
: interactive!$
: 직전 명령의 마지막 인자. history로 보면 대체된 결과가 나옴.$_
: 직전 명령의 마지막 인자. history 로 보면 그냥 $_
가 나옴.!^
: 첫번째 인자!:2
: 두번째 인자!:2-$
, !:2*
: 두번째부터 마지막 인자까지!:2-
: 두번째 부터 마지막에서 바로 앞 인자까지!:2-3
: 두번째~세번째 인자까지!*
: 모든 인자들$$
: 현재 스크립트 혹은 shell 의 PID$!
: 직전 명령의 PID How to return pid of a last command in Linux / Unix - nixCraft# $(명령어) 문법 test=$(basename "$file") # backquote `명령어` 문법 test=`basename "$file"`
!환경변수이름을가진변수
: 붙여써야 한다.foo=bar test=foo echo ${!test}
$((계산식))
로 계산결과를 받을 수 있다.$ echo "2 + 3 = $((2+3))" 2 + 3 = 5
# 10진수를 16진수로 출력 printf "%x" 365 #==> 16d # 16진수를 10진수로 printf "%d" 0x16d # 16진수 앞에 0x를 붙여야함. #==> 365 # bc 이용하여 10진수를 16진수로 echo "ibase=10; obase=16; 숫자" | bc
numbers - How to zero pad a sequence of integers in bash so that all have the same width? 포맷팅된 숫자로 for loop 돌기
# -f "%0숫자g" : 숫자만큼 0채우기 # -w : 제일큰 숫자를 기준으로 알아서 0 채워주기 for i in $(seq -f "%05g" 10 15) do echo $i done # 결과 00010 00011 00012 00013 00014 00015
# printf 사용 i=99 printf "%05d\n" $i # 결과 00099 # 결과를 변수에 저장하기 -v i=99 printf -v j "%05d" $i echo $j #결과 00099
bash 4.x 에서는
for i in {00..10}; do echo $i done # 결과 00 01 02 03 04...
# MYVAR 변수에 값을 입력 받아 출력 read MYVAR echo $MYVAR # 비밀번호 형태로 입력 받기 : -s 옵션, -p는 프롬프트 read -s -p "Type new password: " MYPASSWD echo $MYPASSWD
set -o vi
set -o emacs
bind -P
ESC
눌러 명령행 모드 진입v
: VI 에디터로 명령 편집하기. $VISUAL
이나 $EDITOR
환경 변수에 지정된 편집기 사용.#
: 현재 입력중인 명령을 주석처리해서 히스토리에 남긴다. 나중에 히스토리에서 불러내에 주석을 풀고 실행하면 된다.cc
| 'S' : 현재 줄 전체 변경<Ctrl-w>
: 앞 단어 지우기<Ctrl-u>
: 현재 위치부터 줄 처음까지 삭제<Ctrl-r>
: 명령 히스토리 역방향 검색<Ctrl-s>
: 명령 히스토리 전방 검색. 대부분의 터미널이 <Ctrl-s>를 터미널 출력 멈춤으로 사용하고 있기 때문에 stty 명령으로 변경해 둬야함.n
/N
: 검색 반복.TAB
/ <Ctrl-i>, 명령모드 : =
: 자동 완성*
: 모든 자동완성 대상을 입력하기<Ctrl-t>
: 문자 두 개 교체.inpurc
등을 통해 bash 용 단축키를 만들 수 있다.export HISTTIMEFORMAT='%F %T '
read 환경변수명
echo -n "Enter your name and press [ENTER]: " read name
read -s 환경변수명
: 비밀번호 등의 입력을 받을 때 처럼 입력 값을 숨겨줌.dirname "/path/to/filename.ext" # /path/to basename "/path/to/filename.ext" # filename.ext basename "/path/to/filename.ext" .ext # filename - 확장자까지 제거 # filename 이라는 환경변수가 있을때 filename="filename.ext" # 확장자 (extension) 추출 "${filename##*.}" # 확장자를 제외한 파일 이름 추출 "${file%.*}"
filename=$(basename "$fullfile") # 경로에서 파일 이름만 추출 extension="${filename##*.}" # 파일 이름 중 확장자만 추출 filename="${filename%.*}" # 파일 이름 중 확장자 빼고 추출
read
명령 사용read varname # varname 으로 입력값 저장 read -p 'press enter' varname # prompt
Check existence of input argument in a Bash shell script
if [ $# -eq 0 ] then echo "No arguments supplied" exit fi # 혹은 특정 파라미터가 "" empty 인지 검사 if [ -z "$1" ] then echo "No argument supplied" exit fi
# if 문 if [ -z "${VARIABLE}" ]; then FOO='default' else FOO=${VARIABLE} fi # VARIABLE 환경변수가 존재하지 않으면 empty 이면 FOO를 default 로 설정 FOO="${VARIABLE:-default} # VARIABLE 환경변수가 존재하지 않거나 empty 이면 FOO와 VARIABLE을 모두 default 로 설정 FOO="${VARIABLE:=default}" # 첫번째 명령행 인자에 대해 존재하지 않으면 DEFAULTVALUE 환경변수의 값으로 지정하기 FOO="${1:-$DEFAULTVALUE}" # chainig도 된다. DOCKER_LABEL=${GIT_TAG:-${GIT_COMMIT_AND_DATE:-latest}}
Ctrl-X Ctrl-E
를 누르면 $EDITOR
혹은 $VISUAL
에 지정된 에디터로 명령행을 편집할 수 있다.set -o vi
모드일 때는 ~/.inputrc
에 아래 내용을 넣고 Ctrl-X Ctrl-E
를 누른다bind -m vi-insert '"\C-x\C-e": edit-and-execute-command'
b
등 몇몇 글자가 안쳐지는 현상이 있었음.echo
명령으로 환경변수 내용을 파일로 저장할 때 환경변수를 따옴표로 감싸지 않으면 환경변수 내의 새줄 기호나 echo
관련 플래그 등이 해석이 돼 버린다.echo "${MY_ENV}" > myfile.txt
set -eux -o pipefail shopt -s failglob
set -e
: 오류 발생시 즉시 종료. 이것보다는 trap
사용을 권장함. BashFAQ/105 -Why doesn't set -e (or set -o errexit, or trap ERR) do what I expected?set +e
: 기본값. 오류 발생해도 무시하고 스크립트 진행.*
, ?
사용)을 금지시킨다.shopt -s failglob
이게 낫다. shopt -s failglob
는 globbing 에 일치하는 파일명들이 존재하지 않으면 오류 발생.xx | yy
) 실패시에 해당 줄 전체를 실패로 만든다. 이는 set -e
와 합쳐져서 스크립트 전체를 중단하게 한다.!
문자의 history 치환 비활성화!(<glob>)
으로 지정한다.shopt -s extglob # *Music* 을 제외하고 복사 cp !(*Music*) /target_directory # extglob 끄기 shopt -u extglob
# 함수 목록 보기 declare -F declare -f # 정의 포함 전체 목록 # 함수의 정의 보기 declare -f <function이름> # or type <function이름>
./xx/yy
와 혼란을 줌.. 다른파일
: 은 source
명령과 같다.명령어 &
: background로 실행.(명령어 &)
: background로 실행하되 관련 실행 정보가 화면에 뿌려지는 것을 막음(예: Done, PID등의 정보)