목차

Bash

shell template

Redirect

변수들

$-

직전 명령의 argument 대체

실행 결과 변수에 저장

# $(명령어) 문법
test=$(basename "$file")
 
# backquote `명령어` 문법
test=`basename "$file"`

환경변수에 저장된 환경변수 이름으로 값 얻기

foo=bar
test=foo
echo ${!test}

계산 하기

$ echo "2 + 3 = $((2+3))"
2 + 3 = 5

16진수/10진수(hex/dec)간 변환

# 10진수를 16진수로 출력
printf "%x" 365
#==> 16d
 
# 16진수를 10진수로
printf "%d" 0x16d # 16진수 앞에 0x를 붙여야함.
#==> 365
 
# bc 이용하여 10진수를 16진수로
echo "ibase=10; obase=16; 숫자" | bc

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 돌기

# -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

VI 모드/ Emacs 모드

set -o vi

VI 모드 명령

Shortcuts

History에 시간 남기기

strftime 포맷

export HISTTIMEFORMAT='%F %T '

사용자 입력

File Path dir/filename 분리

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 name / extension 분리

User Input 사용자 입력

shell script 파라미터 갯수 검사

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

environment variable empty 검사 혹은 기본값 지정

# 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}}

test

Editor로 명령 편집하기

echo 로 환경변수 내용을 파일로 저장하기

echo "${MY_ENV}" > myfile.txt

Safe Shell Script

set -eux -o pipefail
shopt -s failglob

set -e

set -u

set -f

set -o pipefail

set -x

set +H

shopt

shopt extglob

shopt -s extglob
# *Music* 을 제외하고 복사
cp !(*Music*) /target_directory
 
# extglob 끄기
shopt -u extglob

Special parameters

function 목록 / 정의

# 함수 목록 보기
declare -F
declare -f # 정의 포함 전체 목록
# 함수의 정의 보기
declare -f <function이름>
# or
type <function이름>

dot(.)

bash-it

background job

참조