사용자 도구

사이트 도구


linux:bash

문서의 이전 판입니다!


Bash

shell template

Redirect

변수들

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

$-

  • 현재 shell 의 설정값
  • H : histexpand
  • m : monitor
  • h : hashall
  • B : braceexpand
  • i 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'' 명령과 같다.

bash-it

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

참조

1)
2+3
linux/bash.1651295070.txt.gz · 마지막으로 수정됨: 2022/04/30 14:04 저자 kwon37xi