문서의 이전 판입니다!
command-name &>file
: 명령의 표준 출력과 표준 에러를 모두 file로 지정cat textfile.txt > somefile 2>&1
: 표준 출력은 somefile로 지정되고 표준에러도 표준출력(핸재 somefile)로 함께 보낸다.$1
, $2
, … : 셸 스크립트 인자 순서대로$#
: 셸 스크립트 인자의 총 갯수$*
$@
$?
: 직전 명령 exit code. 0
이면 정상 종료.$-
: 현재 shell 의 설정H
: histexpandm
: monitorh
: hashallB
: braceexpandi
interactive
==== 직전 명령의 argument 대체 ====
* syntax - What is bang dollar (!$) in Bash? - Stack Overflow
*
!$ : 직전 명령의 마지막 인자. history로 보면 대체된 결과가 나옴.
*
$_ : 직전 명령의 마지막 인자. history 로 보면 그냥
$_가 나옴.
*
!^ : 첫번째 인자
*
!:2 : 두번째 인자
*
!:2-$,
!:2* : 두번째부터 마지막 인자까지
*
!:2- : 두번째 부터 마지막에서 바로 앞 인자까지
*
!:2-3 : 두번째~세번째 인자까지
*
!* : 모든 인자들
*
$$ : 현재 스크립트 혹은 shell 의 PID
*
$! : 직전 명령의 PID How to return pid of a last command in Linux / Unix - nixCraft
===== 실행 결과 변수에 저장 =====
<code sh>
# $(명령어) 문법
test=$(basename “$file”)
# backquote `명령어` 문법
test=`basename “$file”`
</code>
===== 계산 하기 =====
*
$((계산식)) 로 계산결과를 받을 수 있다.
* Shell Arithmetic (Bash Reference Manual)
<code sh>
$ echo “2 + 3 = $1)”
2 + 3 = 5
</code>
===== 16진수/10진수(hex/dec)간 변환 =====
<code sh>
# 10진수를 16진수로 출력
printf “%x” 365
#=⇒ 16d
# 16진수를 10진수로
printf “%d” 0x16d # 16진수 앞에 0x를 붙여야함.
#=⇒ 365
# bc 이용하여 10진수를 16진수로
echo “ibase=10; obase=16; 숫자” | bc
</code>
Hex to decimal conversion bash newbie
===== for loop 숫자 =====
numbers - How to zero pad a sequence of integers in bash so that all have the same width? 포맷팅된 숫자로 for loop 돌기
<code sh>
for i in $(seq -f “%05g” 10 15)
do
echo $i
done
# 결과
00010
00011
00012
00013
00014
00015
</code>
<code sh>
# printf 사용
i=99
printf “%05d\n” $i
# 결과
00099
# 결과를 변수에 저장하기 -v
i=99
printf -v j “%05d” $i
echo $j
#결과
00099
</code>
bash 4.x 에서는
<code sh>
for i in {00..10}; do
echo $i
done
# 결과
00
01
02
03
04…
</code>
===== 변수에 값 입력 받기 =====
<code sh>
# MYVAR 변수에 값을 입력 받아 출력
read MYVAR
echo $MYVAR
# 비밀번호 형태로 입력 받기 : -s 옵션, -p는 프롬프트
read -s -p “Type new password: ” MYPASSWD
echo $MYPASSWD
</code>
===== VI 모드/ Emacs 모드 =====
* VI 에디터 편집 모드로 명령행을 변경한다.
* Working Productively in Bash's Vi Command Line Editing Mode (with Cheat Sheet) <code sh>
set -o vi
</code>
* Emacs 모드<code sh>
set -o emacs
</code>
* 키 바인딩 목록 보기<code sh>
bind -P
</code>
==== VI 모드 명령 ====
* VI mode Cheatsheet
*
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> : 문자 두 개 교체
===== Shortcuts =====
* Cheatsheet: Productivity-boosting Bash shortcuts | Serverwise
* The List Of Useful Bash Keyboard Shortcuts - OSTechNix
* Custom Bash config - Set up of .bashrc/.inputrc files for a fast and efficient shell experience - YouTube
*
.inpurc 등을 통해 bash 용 단축키를 만들 수 있다.
===== History에 시간 남기기 =====
strftime 포맷
<code sh>
export HISTTIMEFORMAT='%F %T '
</code>
===== 사용자 입력 =====
* Catching user input
*
read 환경변수명<code sh>
echo -n “Enter your name and press [ENTER]: ”
read name
</code>
*
read -s 환경변수명 : 비밀번호 등의 입력을 받을 때 처럼 입력 값을 숨겨줌.
===== File Path dir/filename 분리 =====
<code sh>
dirname “/path/to/filename.ext” # /path/to
basename “/path/to/filename.ext” # filename.ext
</code>
* realpath : full 경로 확인
===== Filename name / extension 분리 =====
* 파일 이름에서 이름과 확장자 분리하기<code sh>
filename=$(basename “$fullfile”) # 경로에서 파일 이름만 추출
extension=“${filename##*.}” # 파일 이름 중 확장자만 추출
filename=“${filename%.*}” # 파일 이름 중 확장자 빼고 추출
</code>
===== User Input 사용자 입력 =====
* http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_08_02.html
*
read 명령 사용<code sh>
read varname # varname 으로 입력값 저장
read -p 'press enter' varname # prompt
</code>
===== shell script 파라미터 갯수 검사 =====
Check existence of input argument in a Bash shell script
<code sh>
if [ $# -eq 0 ]
then
echo “No arguments supplied”
exit
fi
# 혹은 특정 파라미터가 “” empty 인지 검사
if [ -z “$1” ]
then
echo “No argument supplied”
exit
fi
</code>
===== test =====
* [Ubuntu/Linux] 쉘스크립트 test 명령문의 모든 것
===== Editor로 명령 편집하기 =====
*
Ctrl-X Ctrl-E를 누르면
$EDITOR 혹은
$VISUAL에 지정된 에디터로 명령행을 편집할 수 있다.
*
set -o vi 모드일 때는
~/.inputrc에 아래 내용을 넣고
Ctrl-X Ctrl-E를 누른다<code sh>
bind -m vi-insert '“\C-x\C-e”: edit-and-execute-command'
</code>
* 위 명령 실행후
b 등 몇몇 글자가 안쳐지는 현상이 있었음.
===== echo 로 환경변수 내용을 파일로 저장하기 =====
*
echo 명령으로 환경변수 내용을 파일로 저장할 때 환경변수를 따옴표로 감싸지 않으면 환경변수 내의 새줄 기호나
echo 관련 플래그 등이 해석이 돼 버린다.
* 환경변수 내용을 그대로 파일로 만들고 싶다면 환경변수를 따옴표로 감싸야한다.
<code sh>
echo “${MY_ENV}” > myfile.txt
</code>
===== Safe Shell Script =====
* Writing Safe Shell Scripts
* Safer bash scripts with 'set -euxo pipefail' · vaneyckt.io
* The Set Builtin (Bash Reference Manual)
<code sh>
set -eux -o pipefail
shopt -s failglob
</code>
==== set -e ====
*
set -e : 오류 발생시 즉시 종료. 이것보다는
trap 사용을 권장함. BashFAQ/105 -Why doesn't set -e (or set -o errexit, or trap ERR) do what I expected?
*
set +e : 기본값. 오류 발생해도 무시하고 스크립트 진행.
==== set -u ====
* unset variable 이 있으면 즉시 종료
==== set -f ====
* 파일명 확장(globbing,
*,
? 사용)을 금지시킨다.
* globbing 을 사용한다면
shopt -s failglob 이게 낫다.
shopt -s failglob는 globbing 에 일치하는 파일명들이 존재하지 않으면 오류 발생.
==== set -o pipefail ====
* pipeline 의 일부 명령 실패시 (
xx | yy) 실패시에 해당 줄 전체를 실패로 만든다. 이는
set -e와 합쳐져서 스크립트 전체를 중단하게 한다.
==== set -x ====
* 매 명령 실행 직전에 명령 자체를 출력한다.
==== set +H ====
*
! 문자의 history 치환 비활성화
===== shopt =====
* The Shopt Builtin (Bash Reference Manual)
==== shopt extglob ====
* globbing 시에 추가할 파일이 아닌 제외할 파일을 지정할 수 있다.
* bash - How can I use inverse or negative wildcards when pattern matching in a unix/linux shell? - Stack Overflow
* 제외할 glob 을
!(<glob>) 으로 지정한다.
<code sh>
shopt -s extglob
# *Music* 을 제외하고 복사
cp !(*Music*) /target_directory
# extglob 끄기
shopt -u extglob
</code>
===== Special parameters =====
* Special Parameters (Bash Reference Manual)
===== function 목록 / 정의 =====
* bash - How do I list the functions defined in my shell? - Stack Overflow
<code sh>
# 함수 목록 보기
declare -F
declare -f # 정의 포함 전체 목록
# 함수의 정의 보기
declare -f <function이름>
# or
type <function이름>
</code>
===== dot(.) =====
* 현재 디렉토리를 가리키는
./xx/yy와 혼란을 줌.
* How and When to Use the Dot Command in Bash?
*
. 다른파일 : 은
source'' 명령과 같다.