사용자 도구

사이트 도구


linux:bash

Bash

shell template

Redirect

변수들

  • $1, $2, … : 셸 스크립트 인자 순서대로
  • $# : 셸 스크립트 인자의 총 갯수
  • $*
  • $@
  • $? : 직전 명령 exit code. 0이면 정상 종료.
  • $- : 현재 shell 의 설정

$-

직전 명령의 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
  • Emacs 모드
    set -o emacs
  • 키 바인딩 목록 보기
    bind -P

VI 모드 명령

  • 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

History에 시간 남기기

strftime 포맷

export HISTTIMEFORMAT='%F %T '

사용자 입력

  • read 환경변수명
    echo -n "Enter your name and press [ENTER]: "
    read name
  • read -s 환경변수명 : 비밀번호 등의 입력을 받을 때 처럼 입력 값을 숨겨줌.

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 분리

  • 파일 이름에서 이름과 확장자 분리하기
    filename=$(basename "$fullfile") # 경로에서 파일 이름만 추출
    extension="${filename##*.}" # 파일 이름 중 확장자만 추출
    filename="${filename%.*}" # 파일 이름 중 확장자 빼고 추출

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로 명령 편집하기

  • 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 관련 플래그 등이 해석이 돼 버린다.
  • 환경변수 내용을 그대로 파일로 만들고 싶다면 환경변수를 따옴표로 감싸야한다.
echo "${MY_ENV}" > myfile.txt

Safe Shell Script

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

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

  • bash-it bash framework. 다양한 bash 확장
  • oh-my-bash bash 확장. bash-it 이 더 인기 좋음. 성능저하가 있었음(2018)

background job

  • 명령어 & : background로 실행.
  • (명령어 &) : background로 실행하되 관련 실행 정보가 화면에 뿌려지는 것을 막음(예: Done, PID등의 정보)

참조

linux/bash.txt · 마지막으로 수정됨: 2024/02/07 08:41 저자 kwon37xi