Skip to content

Latest commit

ย 

History

History
399 lines (356 loc) ยท 15.2 KB

SHELL_SCRIPT.md

File metadata and controls

399 lines (356 loc) ยท 15.2 KB

์ฒซ ์‹œ์ž‘์€ ๋ฌธ์ž ์ถœ๋ ฅํ•˜๊ธฐ(Hello World)

๊ณ ์ „์ ์ด์ง€๋งŒ "hello world" ๋‹จ์ˆœ ์ถœ๋ ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์ž. ํŒŒ์ผ๋ช…์€ hello.sh๋กœ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•ด๋ณด์ž. ๋‹จ ๋‘์ค„์ด๋ฉด ๋์ด๋‹ค. (๋งŒ์ผ ์‹คํ–‰์ด ์•ˆ๋œ๋‹ค๋ฉด ํผ๋ฏธ์…˜์„ ๋ณ€๊ฒฝํ•ด์•ผ๋˜๋Š”๋ฐ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ํ•ด๋ด๋ผ.chmod 700 hello.sh) ์ฐธ๊ณ : echo ๋ฌธ์žฅ์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์ž๋™์œผ๋กœ ์ค„๋ฐ”๊ฟˆ ๋จ ์ฐธ๊ณ : printf C์–ธ์–ด์™€ ๋น„์Šทํ•จ

#!/usr/bin/env bash
echo "hello world"
printf "hello world"
printf "%s %s" hello world

#์ฃผ์„(Comments)

๊ธฐํ˜ธ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ฃผ์„์ด๋‹ค.

ํ•จ์ˆ˜(Function) ํ˜•์‹์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์ฐจ์ด๋Š” ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ function๋Š” ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค. ํ•จ์ˆ˜ ๋ช…์„ ์“ฐ๋ฉด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋Š”๋ฐ ์ฃผ์˜ํ•  ๊ฒƒ์€ ํ˜ธ์ถœ ์ฝ”๋“œ๊ฐ€ ํ•จ์ˆ˜ ์ฝ”๋“œ๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ๋’ค์— ์žˆ์–ด์•ผ ๋œ๋‹ค. ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ณด๋‹ค ์•ž์—์„œ ํ˜ธ์ถœ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

string_test() {
    echo "string test"
}

function string_test2() {
    echo "string test 2"
    echo "์ธ์ž๊ฐ’: ${@}"
}
string_test
string_test2

ํ•จ์ˆ˜์— ์ธ์ž๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ(๊ณต๋ฐฑ์˜๋กœ ๋›ฐ์–ด์„œ 2๊ฐœ์˜ ์ธ์ž๊ฐ’์„ ๋„˜๊น€)

string_test2 "hello" "world"

#๋ณ€์ˆ˜(Variable) ๋ณ€์ˆ˜ ์‚ฌ์šฉ์‹œ์—๋Š” "=" ๊ธฐํ˜ธ ์•ž๋’ค๋กœ ๊ณต๋ฐฑ์ด ์—†์ด ์ž…๋ ฅํ•˜๋ฉด ๋Œ€์ž…์—ฐ์‚ฐ์ž๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ๋ณ€์ˆ˜(global variable)๋‹ค. ๋‹จ ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ง€์—ญ ๋ณ€์ˆ˜(local variable)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์‚ฌ์šฉํ• ๋ ค๋ฉด ๋ณ€์ˆ˜ ๋ช… ์•ž์— local์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ์‹คํ–‰๋œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค. ์ž์‹ ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜๋‹ค. ๋ณ€์ˆ˜ ๋ช… ์•ž์— export์„ ๋ถ™์—ฌ์ฃผ๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜(environment variable)๋กœ ์„ค์ •๋˜์–ด ์ž์‹ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์‹œ ์˜ˆ์•ฝ ๋ณ€์ˆ˜(reserved variable)์— ์ฃผ์˜ํ•˜์ž.(์ฐธ๊ณ ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” .bash_profile์—์„œ ์ •์˜ํ•œ๋‹ค.)

์ „์—ญ ๋ณ€์ˆ˜ ์ง€์ •

string="hello world"
echo ${string}

์ง€์—ญ ๋ณ€์ˆ˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜

string_test() {
    # ์ „์—ญ ๋ณ€์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•จ. ๋งŒ์•ฝ local ๋บ€๋‹ค๋ฉด ์ „์—ญ ๋ณ€์ˆ˜์— ๋ฎ์–ด์”Œ์–ด์ง€๊ฒŒ ๋จ
    local string="local"
    echo ${string}
}

์ง€์—ญ ๋ณ€์ˆ˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ

string_test
# ์ง€์—ญ ๋ณ€์ˆ˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์—์„œ ๋™์ผํ•œ ๋ณ€์ˆ˜ ๋ช…์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
echo ${string}

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ ์–ธ

export hello_world="hello world..."

์ž์‹ ์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ถœ์€ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ์„ ์“ฐ๋ฉด๋œ๋‹ค.

/home/export_test.sh

#ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด export_test.sh ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค. echo ${hello_world}

์˜ˆ์•ฝ ๋ณ€์ˆ˜(Reserved Variable) ๋ฌธ์ž ์„ค๋ช… HOME ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ PATH ์‹คํ–‰ ํŒŒ์ผ์„ ์ฐพ์„ ๊ฒฝ๋กœ LANG ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์‹œ ๊ธฐ๋ณธ ์ง€์›๋˜๋Š” ์–ธ์–ด PWD ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ๋””๋ ‰ํ† ๋ฆฌ FUNCNAME ํ˜„์žฌ ํ•จ์ˆ˜ ์ด๋ฆ„ SECONDS ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ ์ดˆ ๋‹จ์œ„ ์‹œ๊ฐ„ SHLVL ์‰˜ ๋ ˆ๋ฒจ(์ค‘์ฒฉ๋œ ๊นŠ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ„) SHELL ๋กœ๊ทธ์ธํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์‰˜ PPID ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ PID BASH BASH ์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ BASH_ENV ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์‹œ BASH ์‹œ์ž‘ ํŒŒ์ผ์„ ์ฝ์„ ์œ„์น˜ ๋ณ€์ˆ˜ BASH_VERSION ์„ค์น˜๋œ BASH ๋ฒ„์ „ BASH_VERSINFO BASH_VERSINFO[0]~BASH_VERSINFO[5]๋ฐฐ์—ด๋กœ ์ƒ์„ธ์ •๋ณด ์ œ๊ณต MAIL ๋ฉ”์ผ ๋ณด๊ด€ ๊ฒฝ๋กœ MAILCHECK ๋ฉ”์ผ ํ™•์ธ ์‹œ๊ฐ„ OSTYPE ์šด์˜์ฒด์ œ ์ข…๋ฅ˜ TERM ๋กœ๊ธด ํ„ฐ๋ฏธ๋„ ํƒ€์ž… HOSTNAME ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ HOSTTYPE ์‹œ์Šคํ…œ ํ•˜๋“œ์›จ์–ด ์ข…๋ฅ˜ MACHTYPE ๋จธ์‹  ์ข…๋ฅ˜(HOSTTYPE๊ณผ ๊ฐ™์€ ์ •๋ณด์ง€๋งŒ ์กฐ๊ธˆ๋” ์ƒ์„ธํ•˜๊ฒŒ ํ‘œ์‹œ๋จ) LOGNAME ๋กœ๊ทธ์ธ ์ด๋ฆ„ UID ์‚ฌ์šฉ์ž UID EUID su ๋ช…๋ น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ์œ ํšจ ์•„์ด๋”” ๊ฐ’(UID์™€ EUID ๊ฐ’์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ) USER ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„ USERNAME ์‚ฌ์šฉ์ž ์ด๋ฆ„ GROUPS ์‚ฌ์šฉ์ž ๊ทธ๋ฃน(/etc/passwd ๊ฐ’์„ ์ถœ๋ ฅ) HISTFILE history ํŒŒ์ผ ๊ฒฝ๋กœ HISTFILESIZE history ํŒŒ์ผ ํฌ๊ธฐ HISTSIZE history ์ €์žฅ๋˜๋Š” ๊ฐœ์ˆ˜ HISTCONTROL ์ค‘๋ณต๋˜๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ๊ธฐ๋ก ์œ ๋ฌด DISPLAY X ๋””์Šคํ”Œ๋ ˆ์ด ์ด๋ฆ„ IFS ์ž…๋ ฅ ํ•„๋“œ ๊ตฌ๋ถ„์ž(๊ธฐ๋ณธ๊ฐ’: - ๋นˆ์นธ) VISUAL VISUAL ํŽธ์ง‘๊ธฐ ์ด๋ฆ„ EDITOR ๊ธฐ๋ณธ ํŽธ์ง‘๊ธฐ ์ด๋ฆ„ COLUMNS ํ˜„์žฌ ํ„ฐ๋ฏธ๋„์ด๋‚˜ ์œˆ๋„์šฐ ํ„ฐ๋ฏธ๋„์˜ ์ปฌ๋Ÿผ ์ˆ˜ LINES ํ„ฐ๋ฏธ๋„์˜ ๋ผ์ธ ์ˆ˜ LS_COLORS ls ๋ช…๋ น์˜ ์ƒ‰์ƒ ๊ด€๋ จ ์˜ต์…˜ PS1 ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ ๋ณ€์ˆ˜(๊ธฐ๋ณธ๊ฐ’: bash$) PS2 ๋ณด์กฐ ํ”„๋กฌํ”„ํŠธ ๋ณ€์ˆ˜(๊ธฐ๋ณธ๊ฐ’: >), ๋ช…๋ น์„ ""๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น ํ–‰์„ ์—ฐ์žฅ์‹œ ์‚ฌ์šฉ๋จ PS3 ์‰˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ select ์‚ฌ์šฉ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ณ€์ˆ˜(๊ธฐ๋ณธ๊ฐ’: #?) PS4 ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๋””๋ฒ„๊น… ๋ชจ๋“œ์˜ ํ”„๋กฌํ”„ํŠธ ๋ณ€์ˆ˜(๊ธฐ๋ณธ๊ฐ’: +) TMOUT 0์ด๋ฉด ์ œํ•œ์ด ์—†์œผ๋ฉฐ time์‹œ๊ฐ„ ์ง€์ •์‹œ ์ง€์ •ํ•œ ์‹œ๊ฐ„ ์ดํ›„ ๋กœ๊ทธ์•„์›ƒ

์œ„์น˜ ๋งค๊ฐœ ๋ณ€์ˆ˜(Positional Parameters) ๋ฌธ์ž ์„ค๋ช… $0 ์‹คํ–‰๋œ ์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„ $1 $1 $2 $3...${10}์ธ์ž ์ˆœ์„œ๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค. 10๋ฒˆ์งธ๋ถ€ํ„ฐ๋Š” "{}"๊ฐ์‹ธ์ค˜์•ผ ํ•จ $* ์ „์ฒด ์ธ์ž ๊ฐ’ $@ ์ „์ฒด ์ธ์ž ๊ฐ’($* ๋™์ผํ•˜์ง€๋งŒ ์Œ๋”ฐ์˜ดํ‘œ๋กœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ์‹ธ๋ฉด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๋‚˜์˜ด) $# ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ด ๊ฐœ์ˆ˜

ํŠน์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜(Special Parameters) ๋ฌธ์ž ์„ค๋ช… $$ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์˜ PID $? ์ตœ๊ทผ์— ์‹คํ–‰๋œ ๋ช…๋ น์–ด, ํ•จ์ˆ˜, ์Šคํฌ๋ฆฝํŠธ ์ž์‹์˜ ์ข…๋ฃŒ ์ƒํƒœ $! ์ตœ๊ทผ์— ์‹คํ–‰ํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ(๋น„๋™๊ธฐ) ๋ช…๋ น์˜ PID $- ํ˜„์žฌ ์˜ต์…˜ ํ”Œ๋ž˜๊ทธ $_ ์ง€๋‚œ ๋ช…๋ น์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ ์„ค์ •๋œ ํŠน์ˆ˜ ๋ณ€์ˆ˜

๋งค๊ฐœ ๋ณ€์ˆ˜ ํ™•์žฅ(Parameter Expansion) ์•„๋ž˜ ์˜ˆ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜: string="abc-efg-123-abc" ๋ฌธ์ž ์„ค๋ช… ${๋ณ€์ˆ˜} $๋ณ€์ˆ˜์™€ ๋™์ผํ•˜์ง€๋งŒ {} ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Œ(์˜ˆ: echo ${string}) ${๋ณ€์ˆ˜:์œ„์น˜} ์œ„์น˜ ๋‹ค์Œ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด ์ถ”์ถœ(์˜ˆ: echo ${string:4}) ${๋ณ€์ˆ˜:์œ„์น˜:๊ธธ์ด} ์œ„์น˜ ๋‹ค์Œ๋ถ€ํ„ฐ ์ง€์ •ํ•œ ๊ธธ์ด ๋งŒํผ์˜ ๋ฌธ์ž์—ด ์ถ”์ถœ(์˜ˆ: echo ${string:4:3}) ${๋ณ€์ˆ˜:-๋‹จ์–ด} ๋ณ€์ˆ˜ ๋ฏธ์„ ์–ธ ํ˜น์€ NULL์ผ๋•Œ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •, ์œ„์น˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€(์˜ˆ: echo ${string:-HELLO}) ${๋ณ€์ˆ˜-๋‹จ์–ด} ๋ณ€์ˆ˜ ๋ฏธ์„ ์–ธ์‹œ๋งŒ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •, ์œ„์น˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€(์˜ˆ: echo ${string-HELLO}) ${๋ณ€์ˆ˜:=๋‹จ์–ด} ๋ณ€์ˆ˜ ๋ฏธ์„ ์–ธ ํ˜น์€ NULL์ผ๋•Œ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •, ์œ„์น˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(์˜ˆ: echo ${string:=HELLO}) ${๋ณ€์ˆ˜=๋‹จ์–ด} ๋ณ€์ˆ˜ ๋ฏธ์„ ์–ธ์‹œ๋งŒ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •, ์œ„์น˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(์˜ˆ: echo ${string=HELLO}) ${๋ณ€์ˆ˜:?๋‹จ์–ด} ๋ณ€์ˆ˜ ๋ฏธ์„ ์–ธ ํ˜น์€ NULL์ผ๋•Œ ๋‹จ์–ด ์ถœ๋ ฅ ํ›„ ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ,(์˜ˆ: echo ${string:?HELLO}) ${๋ณ€์ˆ˜?๋‹จ์–ด} ๋ณ€์ˆ˜ ๋ฏธ์„ ์–ธ์‹œ๋งŒ ๋‹จ์–ด ์ถœ๋ ฅ ํ›„ ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ(์˜ˆ: echo ${string?HELLO}) ${๋ณ€์ˆ˜:+๋‹จ์–ด} ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ๋งŒ ๋‹จ์–ด ์‚ฌ์šฉ(์˜ˆ: echo ${string:+HELLO}) ${๋ณ€์ˆ˜+๋‹จ์–ด} ๋ณ€์ˆ˜ ์„ ์–ธ ํ˜น์€ NULL์ผ๋•Œ ๋‹จ์–ด ์‚ฌ์šฉ(์˜ˆ: echo ${string+HELLO}) ${#๋ณ€์ˆ˜} ๋ฌธ์ž์—ด ๊ธธ์ด(์˜ˆ: echo ${#string}) ${๋ณ€์ˆ˜#๋‹จ์–ด} ๋ณ€์ˆ˜์˜ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์งง๊ฒŒ ์ผ์น˜ํ•œ ๋‹จ์–ด ์‚ญ์ œ(์˜ˆ: echo ${string#ab}) ${๋ณ€์ˆ˜##๋‹จ์–ด} ๋ณ€์ˆ˜์˜ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ธธ๊ฒŒ ์ผ์น˜ํ•œ ๋‹จ์–ด ์‚ญ์ œ(์˜ˆ: echo ${string##ab}) ${๋ณ€์ˆ˜%๋‹จ์–ด} ๋ณ€์ˆ˜์˜ ๋’ท๋ถ€๋ถ„๋ถ€ํ„ฐ ์งง๊ฒŒ ์ผ์น˜ํ•œ ๋‹จ์–ด ์‚ญ์ œ(์˜ˆ: echo ${string%bc}) ${๋ณ€์ˆ˜%%๋‹จ์–ด} ๋ณ€์ˆ˜์˜ ๋’ท๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ธธ๊ฒŒ ์ผ์น˜ํ•œ ๋‹จ์–ด ์‚ญ์ œ(์˜ˆ: echo ${string%%bc}) ${๋ณ€์ˆ˜/์ฐพ๋Š”๋‹จ์–ด/๋ณ€๊ฒฝ๋‹จ์–ด} ์ฒ˜์Œ ์ผ์น˜ํ•œ ๋‹จ์–ด๋ฅผ ๋ณ€๊ฒฝ(์˜ˆ: echo ${string/abc/HELLO}) ${๋ณ€์ˆ˜//์ฐพ๋Š”๋‹จ์–ด/๋ณ€๊ฒฝ๋‹จ์–ด} ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ๋ณ€๊ฒฝ(์˜ˆ: echo ${string//abc/HELLO}) ${๋ณ€์ˆ˜/#์ฐพ๋Š”๋‹จ์–ด/๋ณ€๊ฒฝ๋‹จ์–ด} ์•ž๋ถ€๋ถ„์ด ์ผ์น˜ํ•˜๋ฉด ๋ณ€๊ฒฝ(์˜ˆ: echo ${string/#abc/HELLO}) ${๋ณ€์ˆ˜/%์ฐพ๋Š”๋‹จ์–ด/๋ณ€๊ฒฝ๋‹จ์–ด} ๋’ท๋ถ€๋ถ„์ด ์ผ์น˜ํ•˜๋ฉด ๋ณ€๊ฒฝ(์˜ˆ: echo ${string/%abc/HELLO}) ${!๋‹จ์–ด*}, ${!๋‹จ์–ด@} ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ค‘์—์„œ ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ๋ณ€์ˆ˜ ๋ช… ์ถ”์ถœ(์˜ˆ: echo ${!string*}, echo ${!string@})

๋ฐฐ์—ด(Array Variable) ๋ฐฐ์—ด ๋ณ€์ˆ˜ ์‚ฌ์šฉ์€ ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.(์˜ˆ: ${array[1]}) ์ฐธ๊ณ : 1์ฐจ์› ๋ฐฐ์—ด๋งŒ ์ง€์›ํ•จ

๋ฐฐ์—ด์˜ ํฌ๊ธฐ ์ง€์ •์—†์ด ๋ฐฐ์—ด ๋ณ€์ˆ˜๋กœ ์„ ์–ธ

์ฐธ๊ณ : 'declare -a' ๋ช…๋ น์œผ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋ฐฐ์—ด ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ

declare -a array

4๊ฐœ์˜ ๋ฐฐ์—ด ๊ฐ’ ์ง€์ •

array=("hello" "test" "array" "world")

๊ธฐ์กด ๋ฐฐ์—ด์— 1๊ฐœ์˜ ๋ฐฐ์—ด ๊ฐ’ ์ถ”๊ฐ€(์ˆœ์ฐจ์ ์œผ๋กœ ์ž…๋ ฅํ•  ํ•„์š” ์—†์Œ)

array[4]="variable"

๊ธฐ์กด ๋ฐฐ์—ด ์ „์ฒด์— 1๊ฐœ์˜ ๋ฐฐ์—ด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฐ์—ด ์ €์žฅ(๋ฐฐ์—ด ๋ณต์‚ฌ ์‹œ ์‚ฌ์šฉ)

array=(${array[@]} "string")

์œ„์—์„œ ์ง€์ •ํ•œ ๋ฐฐ์—ด ์ถœ๋ ฅ

echo "hello world ์ถœ๋ ฅ: ${array[0]} ${array[3]}" echo "๋ฐฐ์—ด ์ „์ฒด ์ถœ๋ ฅ: ${array[@]}" echo "๋ฐฐ์—ด ์ „์ฒด ๊ฐœ์ˆ˜ ์ถœ๋ ฅ: ${#array[@]}"

printf "๋ฐฐ์—ด ์ถœ๋ ฅ: %s\n" ${array[@]}

๋ฐฐ์—ด ํŠน์ • ์š”์†Œ๋งŒ ์ง€์šฐ๊ธฐ

unset array[4] echo "๋ฐฐ์—ด ์ „์ฒด ์ถœ๋ ฅ: ${array[@]}"

๋ฐฐ์—ด ์ „์ฒด ์ง€์šฐ๊ธฐ

unset array echo "๋ฐฐ์—ด ์ „์ฒด ์ถœ๋ ฅ: ${array[@]}"

๋ณ€์ˆ˜ ํƒ€์ž… ์ง€์ •(Variables Revisited) Bash ๋ณ€์ˆ˜๋Š” ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ž์—ด์ด๋‹ค. ๋‹จ ๋ฌธ๋งฅ์— ๋”ฐ๋ผ์„œ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ถˆ์™„์ „ํ•œ ํ˜•ํƒœ์˜ declare, typeset ํƒ€์ž… ์ง€์ • ๋ช…๋ น์„ ์ง€์›ํ•œ๋‹ค.(๋‘ ๋ช…๋ น์€ ๋™์ผํ•จ) ์ฐธ๊ณ : ์ฝ”๋ฉ˜ํŠธ์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฌธ๋ฒ• ์‚ฌ์šฉ์„ ์ถ”์ฒœํ•œ๋‹ค.

์ฝ๊ธฐ ์ „์šฉ

readonly string_variable="hello world" ๋ฌธ๋ฒ•๊ณผ ๋™์ผ ํ•จ

declare -r string_variable

์ •์ˆ˜

number_variable=10 ๋ฌธ๋ฒ•๊ณผ ๋™์ผ ํ•จ

declare -i number_variable=10

๋ฐฐ์—ด

array_variable=() ๋ฌธ๋ฒ•๊ณผ ๋™์ผ ํ•จ

declare -a array_variable

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

export export_variable="hello world" ๋ฌธ๋ฒ•๊ณผ ๋™์ผ ํ•จ

declare -x export_variable="hello world"

ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์˜ ์ „์ฒด ํ•จ์ˆ˜ ์ถœ๋ ฅ

declare -f

ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง€์ •ํ•œ ํ•จ์ˆ˜๋งŒ ์ถœ๋ ฅ

declare -f ํ•จ์ˆ˜์ด๋ฆ„

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž(Logical Operators) ๋ฌธ์ž ์„ค๋ช… &&, -a ๋…ผ๋ฆฌ AND ||, -o ๋…ผ๋ฆฌ OR

์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž(Arithmetic Operators) ๋ฌธ์ž ์„ค๋ช…

  • ๋”ํ•˜๊ธฐ
  • ๋นผ๊ธฐ
  • ๊ณฑํ•˜๊ธฐ / ๋‚˜๋ˆ„๊ธฐ ** ๋ˆ„์Šน(exponentiation), ๊ฑฐ๋“ญ์ œ๊ณฑ(power) % modulo ๋‚˜ mod (์ •์ˆ˜ ๋‚˜๋ˆ„๊ธฐ์—์„œ ๋‚˜๋จธ์ง€ ๊ฐ’) += ์ƒ์ˆ˜๊ฐ’ ๋งŒํผ ์ฆ๊ฐ€(plus-equal) -= ์ƒ์ˆ˜๊ฐ’ ๋งŒํผ ๊ฐ์†Œ(minus-equal) *= ์ƒ์ˆ˜๊ฐ’์„ ๊ณฑํ•จ(times-equal) /= ์ƒ์ˆ˜๊ฐ’์œผ๋กœ ๋‚˜๋ˆ”(slash-equal) %= ์ƒ์ˆ˜๊ฐ’์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๊ฐ’(mod-equal)

๋น„ํŠธ ์—ฐ์‚ฐ์ž(Bitwise Operators) ๋ฌธ์ž ์„ค๋ช… << ๋น„ํŠธ ์™ผ์ชฝ ์‰ฌํ”„ํŠธ(์‰ฌํ”„ํŠธ ํ•œ ๋ฒˆ๋‹น 2๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•จ) <<= left-shift-equal

๋น„ํŠธ ์˜ค๋ฅธ์ชฝ ์‰ฌํ”„ํŠธ(์‰ฌํ”„ํŠธ ํ•œ ๋ฒˆ๋‹น 2๋กœ ๋‚˜๋ˆ”) = right-shift-equal(<<=์™€ ๋ฐ˜๋Œ€) & ๋น„ํŠธ and &= ๋น„ํŠธ and-equal | ๋น„ํŠธ OR |= ๋น„ํŠธ OR-equa ~ ๋น„ํŠธ negate ! ๋น„ํŠธ NOT ^ ๋น„ํŠธ XOR ^= ๋น„ํŠธ XOR-equa

๊ธฐํƒ€ ์—ฐ์‚ฐ์ž(Miscellaneous Operators) ๋ฌธ์ž ์„ค๋ช… , ์ฝค๋งˆ ์—ฐ์‚ฐ์ž(comma operator), 2๊ฐœ ์ด์ƒ์˜ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ๋ฌถ์–ด์คŒ

์ •์ˆ˜ ๋น„๊ต(Integer Comparison) ๋ฌธ์ž ์„ค๋ช… -eq ๊ฐ™์Œ -ne ๊ฐ™์ง€ ์•Š์Œ

, -gt ๋” ํผ(> ์ด์ค‘ ์†Œ๊ด„ํ˜ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) =, -ge ๋”ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ(>= ์ด์ค‘ ์†Œ๊ด„ํ˜ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) <, -lt ๋” ์ž‘์Œ(< ์ด์ค‘ ์†Œ๊ด„ํ˜ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) <=, -le ๋” ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Œ(<= ์ด์ค‘ ์†Œ๊ด„ํ˜ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๋ฌธ์ž์—ด ๋น„๊ต(String Comparison) ๋ฌธ์ž ์„ค๋ช… =, == ๊ฐ™์Œ != ๊ฐ™์ง€ ์•Š์Œ < ASCII ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ์— ๋” ์ž‘์Œ

ASCII ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ์—์„œ ๋” ํผ -z ๋ฌธ์ž์—ด์ด NULL, ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒฝ์šฐ -n ๋ฌธ์ž์—ด์ด NULL์ด ์•„๋‹˜ ${๋ณ€์ˆ˜} ๋ฌธ์ž์—ด์ด NULL์ด ์•„๋‹˜

ํŒŒ์ผ ๋น„๊ต(File test operators) ๋ฌธ์ž ์„ค๋ช… -e ํŒŒ์ผ์ด ์กด์žฌ -f ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์ผ๋ฐ˜ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ(๋””๋ ‰ํ† ๋ฆฌ ํ˜น์€ ์žฅ์น˜ํŒŒ์ผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ) -s ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  0๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ -d ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ๋””๋ ‰ํ† ๋ฆฌ์ธ ๊ฒฝ์šฐ -b ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ๋ธ”๋ก์žฅ์น˜ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -c ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์บ๋ฆญํ„ฐ ์žฅ์น˜ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -p ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  FIFO์ธ ๊ฒฝ์šฐ -h ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ํ•œ ๊ฐœ ์ด์ƒ์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ -L ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ํ•œ ๊ฐœ ์ด์ƒ์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ -S ํŒŒ์ผ์ด ์†Œ์ผ“ ๋””๋ฐ”์ด์Šค์ธ ๊ฒฝ์šฐ -t ํŒŒ์ผ์ด ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ํ„ฐ๋ฏธ๋„ ๋””๋ฐ”์ด์Šค์™€ ์—ฐ๊ด€์ด ์žˆ์Œ -r ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -w ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -x ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -g ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  SetGID๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ -u ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  SetUID๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ -k ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์Šคํ‹ฐํ‚ค ๋น„ํŠธ(Sticky bit)๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ -O ์ž์‹ ์ด ์†Œ์œ ์ž์ž„ -G ๊ทธ๋ฃน ์•„์ด๋””๊ฐ€ ์ž์‹ ๊ณผ ๊ฐ™์Œ -N ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝํžŒ ํ›„์— ๋ณ€๊ฒฝ ๋์Œ file1 -nt file2 file1 ํŒŒ์ผ์ด file2 ํŒŒ์ผ๋ณด๋‹ค ์ตœ์‹ ์ž„ file1 -ot file2 file1 ํŒŒ์ผ์ด file2 ํŒŒ์ผ๋ณด๋‹ค ์˜ˆ์ „๊ฒƒ์ž„ file1 -ef file2 file1 ํŒŒ์ผ๊ณผ file2 ํŒŒ์ผ์ด ๊ฐ™์€ ํŒŒ์ผ์„ ํ•˜๋“œ ๋งํฌํ•˜๊ณ  ์žˆ์Œ ! ์กฐ๊ฑด์ด ์•ˆ ๋งž์œผ๋ฉด ์ฐธ(์˜ˆ: ! -e file)

๋ฐ˜๋ณต๋ฌธ(for, while, until) ๋ฐ˜๋ชฉ๋ฌธ ์ž‘์„ฑ ์‹œ ์•„๋ž˜ ๋ช…๋ น์–ด(ํ๋ฆ„์ œ์–ด)์„ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ ๋‚˜๊ฐˆ๋•Œ: break ํ˜„์žฌ ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ์กฐ๊ฑด์„ ๊ฑด๋„ˆ ๋›ธ๋•Œ: continue

์ง€์ •๋œ ๋ฒ”์œ„ ์•ˆ์—์„œ ๋ฐ˜๋ณต๋ฌธ ํ•„์š” ์‹œ ์ข‹์Œ

for string in "hello" "world" "..."; do;
    echo ${string};
done

์ˆ˜ํ–‰ ์กฐ๊ฑด์ด true ์ผ๋•Œ ์‹คํ–‰๋จ (์‹คํ–‰ ํšŸ์ˆ˜ ์ง€์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ˜๋ณต๋ฌธ ํ•„์š” ์‹œ ์ข‹์Œ)

count=0
while [ ${count} -le 5 ]; do
    echo ${count}
    count=$(( ${count}+1 ))
done

์ˆ˜ํ–‰ ์กฐ๊ฑด์ด false ์ผ๋•Œ ์‹คํ–‰๋จ (์‹คํ–‰ ํšŸ์ˆ˜ ์ง€์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ˜๋ณต๋ฌธ ํ•„์š” ์‹œ ์ข‹์Œ)

count2=10
until [ ${count2} -le 5 ]; do
    echo ${count2}
    count2=$(( ${count2}-1 ))
done

์กฐ๊ฑด๋ฌธ(if...elif...else...fi) ์กฐ๊ฑด๋ฌธ ์ž‘์„ฑ ์‹œ ์ฃผ์˜ํ•ด์•ผ๋  ๋ถ€๋ถ„์€ ์‹คํ–‰ ๋ฌธ์žฅ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•จ

string1="hello"
string2="world"
if [ ${string1} == ${string2} ]; then
    # ์‹คํ–‰ ๋ฌธ์žฅ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•จ
    # ์•„๋ž˜ echo ๋ฌธ์žฅ์„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๋ฉด ํ™•์ธ ๊ฐ€๋Šฅํ•จ
    echo "hello world"
elif [ ${string1} == ${string3} ]; then
    echo "hello world 2"
else
    echo "hello world 3"
fi

AND

if [ ${string1} == ${string2} ] && [ ${string3} == ${string4} ]
..์ƒ๋žต

OR

if [ ${string1} == ${string2} ] || [ ${string3} == ${string4} ]
..์ƒ๋žต

๋‹ค์ค‘ ์กฐ๊ฑด

if [[ ${string1} == ${string2} || ${string3} == ${string4} ]] && [ ${string5} == ${string6} ]
..์ƒ๋žต

์„ ํƒ๋ฌธ(case) ์ •๊ทœ์‹์„ ์ง€์›ํ•˜๋ฉฐ | ๊ธฐํ˜ธ๋กœ ๋‹ค์ค‘ ๊ฐ’์„ ์ž…๋ ฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์กฐ๊ฑด์˜ ๋ฌธ์žฅ ๋์—๋Š” ;; ๊ธฐํ˜ธ๋กœ ๋์„ ํ‘œ์‹œํ•œ๋‹ค. ์ฐธ๊ณ : ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋Š” ๋‹ค๋ฅธ ๋ฌธ์ž๋‹ค.

case๋ฌธ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ฐ˜๋ณต๋ฌธ

for string in "HELLO" "WORLD" "hello" "world" "s" "start" "end" "etc"; do

    # case๋ฌธ ์‹œ์ž‘
    case ${string} in
        hello|HELLO)
            echo "${string}: hello ์ผ๋•Œ"
            ;;
        wo*)
            echo "${string}: wo๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด ์ผ๋•Œ"
            ;;
        s|start)
            echo "${string}: s ํ˜น์€ start ์ผ๋•Œ"
            ;;
        e|end)
            echo "${string}: e ํ˜น์€ end ์ผ๋•Œ"
            ;;
        *)
            echo "${string}: ๊ธฐํƒ€"
            ;;
    esac
    # //case๋ฌธ ๋

done

๋””๋ฒ„๊น…(Debugging) ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” echo, exit ๋ช…๋ น๋‚˜ tee ๋ช…๋ น์–ด๋กœ ๋””๋ฒ„๊น…ํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰ ์‹œ ์˜ต์…˜์„ ์ฃผ๊ฑฐ๋‚˜ ์ฝ”๋“œ์— ํ•œ์ค„๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋ณผ์ˆ˜ ์žˆ๋‹ค. Bash ์˜ต์…˜(์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ) set ์˜ต์…˜(์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์‚ฝ์ž…) ์„ค๋ช… bash -n set -n, set -o noexec ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—†์ด ๋‹จ์ˆœ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋งŒ ๊ฒ€์‚ฌ(์ฐพ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ์Œ) bash -v set -v, set -o verbose ๋ช…๋ น์–ด ์‹คํ–‰์ „ ํ•ด๋‹น ๋ช…๋ น์–ด ์ถœ๋ ฅ(echo) bash -x set -x, set -o xtrace ๋ช…๋ น์–ด ์‹คํ–‰ํ›„ ํ•ด๋‹น ๋ช…๋ น์–ด ์ถœ๋ ฅ(echo) set -u, set -o nounset ๋ฏธ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ๋ฐœ๊ฒฌ์‹œ "unbound variable" ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ