확장자로 .sh을 사용
첫 문단에 #! /bin/bash
을 써서 실행 쉘 선언 (셔뱅)
실행 방법:
$ bash myscript.sh
: x 권한이 없어도 됨
$ ./myscript.sh
: x 권한이 있어야 함
. myscript.sh
or source myscript.sh
: 설정파일을 불러올 때만 씀
명령어 | 설명 |
---|---|
var=value | 변수 선언 |
${var} | 변수 불러오기, 중괄호 생략 가능 |
unset var | 변수 제거 |
${#var} | 변수 길이 |
${var:start} | start째 문자부터 마지막 문자까지 슬라이싱 |
${var:start:len} | start째 문자부터 len개만큼 슬라이싱 , len은 음수도 가능 |
declare -i var
로 선언jsg@jsg-ubuntu:~$ declare -i var1=123 jsg@jsg-ubuntu:~$ declare -i var2=abc jsg@jsg-ubuntu:~$ echo var1:$var1 var2:$var2 var1:123 var2:0
명령어 | 설명 |
---|---|
declare -a arr=(value1 value2 ...) | 배열 선언 |
arr[i]=value | 요소 지정 |
${#arr[@]} or ${#arr[*]} | 어레이 길이 |
${arr[i]} | i 번째 요소 |
${arr[@]} | 전체 요소, IFS를 기준으로 분리 |
"${arr[@]}" | 전체 요소, 인덱스를 기준으로 분리 |
${arr[*]} | 전체 요소, 인덱스를 기준으로 분리 |
"${arr[*]}" | 전체 요소를 IFS로 구분자로 한줄로 반환 |
${arr[@]:3:2} | 슬라이싱 |
jsg@jsg-ubuntu:~$ cat test.sh #!/bin/bash arr[${#arr[@]}]="Hello World" arr[${#arr[@]}]="Bash Practice" echo "Using IFS={$IFS}" for i in ${arr[@]} do echo "arr[@] = $i" done IFS= echo "Using IFS={$IFS}" for i in ${arr[@]} do echo "arr[@] = $i" done echo "Using @ with quotation mark" for i in "${arr[@]}" do echo "arr[@] = $i" done echo 'Using *' for i in ${arr[*]} do echo "var[*] = $i" done echo 'Using * with quoatation mark' for i in "${arr[*]}" do echo "var[*] = $i" done jsg@jsg-ubuntu:~$ bash test.sh Using IFS={ } arr[@] = Hello arr[@] = World arr[@] = Bash arr[@] = Practice Using IFS={} arr[@] = Hello World arr[@] = Bash Practice Using @ with quotation mark arr[@] = Hello World arr[@] = Bash Practice Using * var[*] = Hello World var[*] = Bash Practice Using * with quoatation mark var[*] = Hello WorldBash Practice
export VAR # 이미 var값이 있는 경우
export VAR=value # 새로 선언을 하는 경우
declare -x VAR=value # ksh 스타일
명령어를 지정한 에디터에서 쓰기
$EDITOR=vim
환경변수 설정 후 터미널에서 Ctrl-X Ctrl-E
# 잘못된 방법 # ~/.bashrc 파일 export PATH=~/development/sdk/bin:$PATH
#올바른 방법 # ~/.bashrc 파일에 삽입 if [ "$(type -t pathmunge)" != 'function' ]; then pathmunge () { [ ! -d "$1" ] && return 1 case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac } fi pathmunge $HOME/development/sdk/bin after
변수 | 설명 |
---|---|
$$ | 현재 쉘의 PID |
$! | 마지막으로 실행된 백그라운드 프로세스의 PID |
$? | 최근 포그라운드 프로세스의 종료값 |
$# | 인수의 개수 (0번째 제외) |
${arr[@]} | 전체 요소, IFS를 기준으로 분리 |
$0, $1, $2, ... | 인수 리스트 |
$* | 전체 인수 목록, " "로 감싸기 가능 |
$@ | 전체 인수를 문자열의 배열, " "로 감싸기 가능 |
${*:2} | 인수 슬라이싱 |
${var:=value} | 변수가 null이면 value를 할당하고 반환 |
${var:-value} | 변수가 null이면 value를 할당하지 않고 반환 |
${var:+value} | 변수가 null이면 그대로, null이 아니면 value를 할당하지 않고 반환 |
${var:?error} | 변수가 null이면 error 메세지 출력 |
$_ | 이전 명령어의 마지막 인수 |
$- | on 되어 있는 실행 옵션 |
jsg@jsg-ubuntu:~$ var1='echo $HOME' jsg@jsg-ubuntu:~$ echo $var1 echo $HOME
jsg@jsg-ubuntu:~$ var1="echo $HOME" jsg@jsg-ubuntu:~$ echo $var1 echo /home/jsg
\
jsg@jsg-ubuntu:~$ var3="echo \$HOME" jsg@jsg-ubuntu:~$ echo $var3 echo $HOME
jsg@jsg-ubuntu:~$ var4=`echo $HOME` jsg@jsg-ubuntu:~$ echo $var4 /home/jsg
jsg@jsg-ubuntu:~$ echo $(date) 2020. 12. 18. (금) 22:33:48 KST
jsg@jsg-ubuntu:~$ a=10; b=20 jsg@jsg-ubuntu:~$ echo $((a+b)) 30 jsg@jsg-ubuntu:~$ let c=a+b jsg@jsg-ubuntu:~$ echo $c 30
jsg@jsg-ubuntu:~$ for str in a{b,c,d}e;do echo $str;done abe ace ade
jsg@jsg-ubuntu:~$ for i in {0..3};do echo $i;done 0 1 2 3
패턴 | 설명 |
---|---|
? | 하나의 문자 |
* | 공백을 포함한 문자열 |
[...] | 안에 있는 문자들 중 하나 |
[!...] | 안에 있는 문자들이 아닌것 중 하나 |
?(pattern) | pattern이 0~1번 발생 |
*(pattern) | pattern이 0번 이상 발생 |
+(pattern) | pattern이 1번 이상 발생 |
@(pattern) | pattern이 1번 발생 |
!(pattern) | pattern이 발생하지 않음 |
`A | B` |
변수 | 설명 |
---|---|
${varname%pattern} | non-greedy 후방탐색 |
${varname%%pattern} | greedy 후방탐색 |
${varname#pattern} | non-greedy 전방탐색 |
${varname##pattern} | greedy 전방탐색 |
jsg@jsg-ubuntu:~$ mynum=1234.56 jsg@jsg-ubuntu:~$ echo ${mynum%.*} 1234 jsg@jsg-ubuntu:~$ echo ${mynum#*.} 56 jsg@jsg-ubuntu:~$ mynum=1234.56.789 jsg@jsg-ubuntu:~$ echo ${mynum%.*} 1234.56 jsg@jsg-ubuntu:~$ echo ${mynum%%.*} 1234 jsg@jsg-ubuntu:~$ echo ${mynum#*.} 56.789 jsg@jsg-ubuntu:~$ echo ${mynum##*.} 789
변수 | 설명 |
---|---|
${varname/pat/replace} | non-greedy 교체 |
${varname//pat/replace} | greedy 교체 |
${varname/#pat/replace} | 앞글자를 포함한 패턴 교체 |
${varname/%pat/replace} | 뒷글자를 포함한 패턴 교체 |
${!prefix*} or ${!prefix@} | prefix로 시작하는 모든 변수 목록 |
jsg@jsg-ubuntu:~$ echo $pn XXX-1234-5678 jsg@jsg-ubuntu:~$ echo ${pn/[0-9]/*} XXX-*234-5678 jsg@jsg-ubuntu:~$ echo ${pn//[0-9]/*} XXX-****-**** jsg@jsg-ubuntu:~$ echo ${pn/#[0-9]/*} XXX-1234-5678 jsg@jsg-ubuntu:~$ echo ${pn/%[0-9]/*} XXX-1234-567* jsg@jsg-ubuntu:~$ echo ${!LANG*} LANG LANGUAGE
변수 | 설명 |
---|---|
declare -a | 어레이 |
declare -f | 함수 |
declare -F | 함수 리스트 |
declare -i | 정수 |
declare -r | readonly |
declare -x | 환경변수 |
declare -p | 변수 리스트 |
declare +<type> | 변수 속성 해제 |