...

Shell Script ๋
Shell Script๋ Shell์ด๋ command line ์ธํฐํ๋ฆฌํฐ์์ ๊ตฌ๋๋๋๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ๋ค.
์๋์ฐ์์๋ batch(๋ฐฐ์นํ์ผ, .bat) ์ ํ๋ฒ์ฏค์ ๋ณธ์ ์ด ์์ ๊ฒ์ด๋ค. bat ํ์ผ์ ์คํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์๋์ผ๋ก ํผ์ ์ญ์ญ ์คํ๋๋๋ฐ, ์ด๋ฌํ batํ์ผ์ ๋ฆฌ๋ ์ค ๋ฒ์ ผ์ด ๋ฐ๋ก shell script๋ผ๊ณ ๋ด๋ ๋๋ค. ๋ฌผ๋ก ์๋์ฐ์ ๋ฆฌ๋ ์ค์ ์คํฌ๋ฆฝํธ๋ ์๋ก ๋ค๋ฅธ ๋ฌธ๋ฒ์ผ๋ก ์๋๋๋ค.
์ ๋ฆฌ๋ฅผ ํ์๋ฉด, ์ฐ๋ฆฌ๊ฐ ํฐ๋ฏธ๋์์ ํ๋ํ๋ ์ ๋ ฅํ๋ ์ฌ๋ฌ ๋ช ๋ น์ด๋ค์ ํ๋์ ์คํฌ๋ฆฝํธ ํ์ผ์ ๋์ดํ์ฌ, ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋์ผ๋ก ์คํ ํจ์ผ๋ก ํจ์จ์ ์ด๋ฉด์ ๊ฐํธํ๊ฒ ์์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ฒ์ด๋ค. ๋ค๋ง Shell Script๋ Interpreter ๋ฐฉ์์ด๋ฏ๋ก, ํ์ค ํ์ค ์ฝ์ด ์คํํจ์ผ๋ก ๋ค์ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค.
์ ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ ์ ๋ฆฌ (Shell Programming)
์ ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ ๊ฒ์ฌ ์ฌ์ดํธ
ShellCheck โ shell script analysis tool
ShellCheck finds bugs in your shell scripts
www.shellcheck.net
์ ์์ฑ ์ฒซ๋ฒ์งธ ํ - Shebang
์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ๋๋ ํญ์ ๊ธฐ์ตํด์ผ ํ ๊ฒ์ด ์๋ค.
๋ฐ๋ก ์ฒซ ๋ฒ์งธํ์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑ ํด์ค์ผ ํ๋ ์ ์ด๋ค.
#!/usr/bin/bash
echo $(which bash) # ๋๋ ํ ๋ฆฌ ์์น ์ถ๋ ฅ
์คํฌ๋ฆฝํธ ์ฒซ ๋ฒ์งธ ์ค์ ์์ฑํ ๋ด์ฉ์ ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ๋ ์ด๋ค ์๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ง ์ ์ํ๋ ๊ณณ ์ด๋ค.
์์๋ ์ฌ๋ฌ ๋ฒ์ ผ์ด ์๋ค.
[์ ๋์ค ์ ์ข ๋ฅ]
- sh : ์ด๊ธฐ์ ์ ๋์ค ์(Bourne shell), 1977๋ ์ ๋ฐํ
- ksh : ์ฝ ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ 1983๋ ๋ฐ์ด๋น๋ ์ฝ์ด ๊ฐ๋ฐํ์ผ๋ฉฐ sh๋ฅผ ํ์ฅํ์ฌ ๋ง๋ฌ.
- csh : 1978๋ ๋ฒํด๋ฆฌ ๋ํ์์ C์ธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ ์.
- bash : 1987๋ ๋ธ๋ผ์ด์ธ ํญ์ค์ ์ํด ๋ง๋ค์ด์ง ์๋ก sh์ ๋๋ถ๋ถ ํธํ.
์ด ๊ฐ์์๋ ๊ฐ์ฅ ๋๋ฆฌ์ฐ์ด๋ bash ์์ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ๋ก ์ฐ์ฌํ ์์ ์ด๋, ์์ ๊ฐ์ด ์ ์ํ์ฌ ๋ฆฌ๋ ์ค์ ํ์ค ์ ์ธ bash๋ก ์คํํ๊ฒ ๋ค๋ ์ ์ธ์ ํ๊ฒ ๋ค๋ ๋ง์ด๋ค.
์ด๋ฌํ ์ ์ ์ธ๋ฌธ์ Shebang์ด๋ผ๊ณ ํ๋ค.
vi๋ก ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ๊ณ , ์ ์ฅ์ ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ๊ถํ(x)๋ฅผ ์ฃผ๊ณ ์์ ์คํํ๋ฉด, bash์ ์ ๋๊ฒฝ๋ก๊ฐ ์ถ๋ ฅ๋๊ฒ ๋๋ค.
$ vi script.sh
# ... ์์ฑํ ์ข
๋ฃ
$ chmod +x script.sh or chmod 755 script.sh
$ ./script.sh # ์ ์คํฌ๋ฆฝํธ ์คํ
$ vi script.sh
# ... ์์ฑํ ์ข
๋ฃ
$ bash script.sh # bash ๋ก ์คํํ๋ฉด ๊ถํ์ ์ฃผ์ง ์๊ณ ๋ ์คํ๋๋ค.

์ ๋ณ์ ์ ์ธ
๋ณ์์ ํ์
์๋ ๋ก์ปฌ๋ณ์์ ์ ์ญ๋ณ์, ํ๊ฒฝ๋ณ์, ์์ฝ๋ณ์, ๋งค๊ฐ๋ณ์ ๋ฑ ๋ค์ํ์ด ์กด์ฌํ๋ค.
- ๋ณ์๋ ๋, ์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ๋ค.
- ๋ณ์์ ์ด๋ฆ์ ์ซ์๋ฅผ ํฌํจํ ์ ์์ง๋ง, ์ซ์๋ก ์์ํ ์ ์๋ค.
- ๋ณ์์๋ ๋ชจ๋ ๊ฐ์ ๋ฌธ์์ด๋ก ์ ์ฅ๋๋ค.
- ๋ณ์์๋ ์๋ฃํ์ ๊ธฐ์ ํ์ง ์๋๋ค. (int number, char names[10]), ์ฆ ์๋ฌด๋ฐ ๊ฐ์ ๋ค ๋ฃ์ ์ ์๋ค.
- ๊ฐ์ ์ฌ์ฉํ ๋๋ ๋ณ์๋ช ์์ ํน์๋ฌธ์ "$"๋ฅผ ์ฌ์ฉํ๋ค. (Ex. echo ${data})
- ๊ฐ์ ๋์ (์ฝ์ )ํ ๋๋ ํน์๋ฌธ์ "$"๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. (Ex. data=mac)
- ๋ณ์๋ฅผ ์์ฑํ ๋๋ "=" ๋์ ๋ฌธ์ ์๋ค๋ก ๊ณต๋ฐฑ์ด ์์ด์ผ ํ๋ค. (Ex. data="abcd")
#!/usr/bin/bash
name="inpa" # ๋ณ์ ์ ์ธ ๋ฐ ๋์
pass=123123 # ๋ฐ์ดํ๋ก ๊ฐ์ธ๋ ๋ง๋ ๋ฌธ์์ด๋ก ์ ์ฅ๋จ
echo $name # {}๊ฐ ์์ผ๋ ์์ผ๋ $๋ง์ผ๋ก ๋ณ์์ ๊ฐ์ ๋ฃ์ด์ค ์ ์์ผ๋, ๋ฌธ์์ด์ ๋ถ์ฌ์ ์ธ๋ ค๋ฉด ${} ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
echo "my name is mr.${name}"
printf "%s" $pass
echo๋ ๊ฐํ์ ํฌํจํ์ฑ ์ถ๋ ฅํ๋ค. C์ธ์ด์ put์ผ๋ก ์๊ฐํด๋ ๋๋ค.
printf๋ ๊ฐํ์ ํฌํจํ์ง ์์์ฑ ์ถ๋ ฅํ๋ค. C์ธ์ด์ printf์ ๊ฐ๋ค

์ ์ญ ๋ณ์ & ์ง์ญ ๋ณ์
์์์ ์ ์ธ๋ ๋ณ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ๋ณ์(global variable)๋ค.
๋จ, ํจ์ ์์์๋ง ์ง์ญ ๋ณ์(local variable)๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ ์ฌ์ฉํ ๋ ค๋ฉด ๋ณ์ ๋ช ์์ local์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
# ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ๋ณ์๋ก ์ง์
string="hello world"
function string_test() {
# local์ ๋ถ์ฌ์ผ ์ง์ญ๋ณ์๋ก ์ธ์. ๋ง์ผ local์ ๋นผ๋ฉด ์ ์ญ๋ณ์ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋๋ฒ๋ฆผ
local string="hello local @@"
echo ${string}
}
# ํจ์ ํธ์ถ
string_test # > hello local @@
echo ${string} # > hello world
# ๋ณ์ ์ด๊ธฐํ
unset string
๋ณ์ ํ์ ์ง์
๊ธฐ๋ณธ์ ์ผ๋ก Bash ๋ณ์๋ ๋ฌธ์์ด๋ง ์ ์ฅํ๋ค.
๋ค๋ง, ์ฌํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ์ด ๋ณ์ ์๋ฃํ ํ์ ์ ๋ฏธ๋ฆฌ ์ง์ ํด์ฃผ๋ ๋ฌธ๋ฒ๋ ์กด์ฌํ๋ค.
# -r ์ฝ๊ธฐ ์ ์ฉ ํ์
(์์ const๋ผ๊ณ ๋ณด๋ฉด ๋๋ค)
declare -r var1
readonly var1
# -i ์ ์ํ ํ์
declare -i number
number=3
echo "number = $number" # number = 3
# -a ๋ฐฐ์ด ํ์
declare -a indices
# -A ์ฐ๊ด๋ฐฐ์ด(MAP) ํ์
declare -A map
# -f ํจ์ ํ์
declare -f
# -x ํ๊ฒฝ๋ณ์(export) ์ง์
declare -x var3 # ์คํฌ๋ฆฝํธ ์ธ๋ถ ํ๊ฒฝ์์๋ ์ด ๋ณ์๋ฅผ ์ธ ์ ์๊ฒ ํด์ค๋ค.
ํ๊ฒฝ ๋ณ์
์ ์คํฌ๋ฆฝํธ์์ ๋ณ์ ๋ช
์์ export์ ๋ถ์ฌ์ฃผ๋ฉด ํ๊ฒฝ ๋ณ์(environment variable)๋ก ์ค์ ๋์ด ์์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ค๋ง ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ์ ์์คํ
์ ๋ฏธ๋ฆฌ ์ ์๋ ์์ฝ ๋ณ์(reserved variable)์ ๋ณ์๋ช
์ด ๊ฒน์น์ง ์๊ฒ ์ฃผ์ํ์.
# /home/export_test.sh ํ์ผ์ ๋ง๋ค๊ณ ์์ฑ
#!/usr/bin/bash
echo ${hello_world}
# ํ๊ฒฝ ๋ณ์ ์ ์ธ
export hello_world="global hello world"
# ์์ ์คํฌ๋ฆฝํธ ํธ์ถ์ ์คํฌ๋ฆฝํธ ๊ฒฝ๋ก์ ์ฐ๋ฉด๋๋ค.
/home/export_test.sh
# > ์์์คํฌ๋ฆฝํธ์ ์ฝ๋์์ ๋ถ๋ชจ์คํฌ๋ฆฝํธ์์ ์ ์ํ hello_world๋ณ์๊ฐ์ด ์ถ๋ ฅ๋๋ค.
๋งค๊ฐ ๋ณ์
ํ๋ก๊ทธ๋จ์์๋ ์คํํ ๋ ์ธ์๋ฅผ ์ฃผ๋ฏ ์ ์คํฌ๋ฆฝํธ๋ ์ญ์ ๊ทธ๋ ๊ฒ ํ ์ ์๋ค.
์คํํ ์คํฌ๋ฆฝํธ ์ด๋ฆ์ ${0}, ๊ทธ ์ดํ๋ ์ ๋ฌ๋ฐ์ ์ธ์ ๊ฐ๋ค์ด๋ค(${1}, ${2}, ...)

์ข ๋ฅ | ์ค๋ช |
$0 | ์คํ๋ ์ ธ ์คํฌ๋ฆฝํธ๋ช |
$1 | ์คํฌ๋ฆฝํธ์ ๋๊ฒจ์ง ์ฒซ ๋ฒ์งธ ์๊ท๋จผํธ |
$2 | ์คํฌ๋ฆฝํธ์ ๋๊ฒจ์ง ๋ ๋ฒ์งธ ์๊ท๋จผํธ |
$3 S4 ๋ฑ๋ฑ...์ญ์ฑ ์ดํ $์ซ์ | ๊ทธ ์ดํ ํด๋น๋๋ ์๊ท๋จผํธ |
$# | ์๊ท๋จผํธ ๊ฐ์ |
$* | ์คํฌ๋ฆฝํธ์ ์ ๋ฌ๋ ์ธ์ ์ ์ฒด๋ฅผ ํ๋์ ๋ณ์์ ์ ์ฅํ๋ฉด IFS ๋ณ์์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก ๊ตฌ๋ถ |
$@ | $*์ ๋์ผํ๋ฐ ๋ค๋ฅธ ์ ์ IFS ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ . |
$! | ์คํ์ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋ณด๋ด์ง ๋ง์ง๋ง ํ๋ก๊ทธ๋จ ํ๋ก์ธ์ค ๋ฒํธ |
$$ | ์ ธ ์คํฌ๋ฆฝํธ์ PID |
$? | ์คํํ ๋ค์ ๋ฐํ ๊ฐ (๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋ ๊ฒ ์ ์ธ) |
#!/bin/bash
echo "script name : ${0}"
echo "๋งค๊ฐ๋ณ์ ๊ฐฏ์ : ${#}"
echo "์ ์ฒด ๋งค๊ฐ๋ณ์ ๊ฐ : ${*}"
echo "์ ์ฒด ๋งค๊ฐ๋ณ์ ๊ฐ2 : ${@}"
echo "๋งค๊ฐ๋ณ์ 1 : ${1}"
echo "๋งค๊ฐ๋ณ์ 2 : ${2}"
$ ./script.sh ๊ฐ ๋ ๋ค ๋ผ ๋ง ๋ฐ ์ฌ
๋งค๊ฐ๋ณ์ ๊ฐฏ์ : 7
์ ์ฒด ๋งค๊ฐ๋ณ์ ๊ฐ : ๊ฐ ๋ ๋ค ๋ผ ๋ง ๋ฐ ์ฌ
์ ์ฒด ๋งค๊ฐ๋ณ์ ๊ฐ2 : ๊ฐ ๋ ๋ค ๋ผ ๋ง ๋ฐ ์ฌ
๋งค๊ฐ๋ณ์ 1 : ๊ฐ
๋งค๊ฐ๋ณ์ 2 : ๋
์์ฝ ๋ณ์
์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉ์๊ฐ ์ ํด์ ๋ง๋ค ์ ์๋ ์ด๋ฏธ ์ ์๋ ๋ณ์๊ฐ ์กด์ฌํ๋ค.
์ด ๋ณ์๋ช ์ ํผํด์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผ ํ๋ค.
๋ณ์ | ์ค๋ช |
HOME | ์ฌ์ฉ์ ํ ๋๋ ํ ๋ฆฌ |
PATH | ์คํ ํ์ผ์ ๊ฒฝ๋ก ์ฌ๋ฌ๋ถ์ด chmod, mkdir ๋ฑ์ ๋ช ๋ น์ด๋ค์ /bin์ด๋ /usr/bin, /sbin์ ์์นํ๋๋ฐ, ์ด ๊ฒฝ๋ก๋ค์ PATH ์ง์ ํ๋ฉด ์ฌ๋ฌ๋ถ๋ค์ ๊ตณ์ด /bin/chmod๋ฅผ ์ ๋ ฅํ์ง ์๊ณ , chmod ์ ๋ ฅ๋ง ํด์ฃผ๋ฉด ๋๋ค. |
LANG | ํ๋ก๊ทธ๋จ ์คํ ์ ์ง์๋๋ ์ธ์ด |
UID | ์ฌ์ฉ์์ UID |
SHELL | ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์คํ๋๋ ์ |
USER | ์ฌ์ฉ์์ ๊ณ์ ์ด๋ฆ |
FUNCNAME | ํ์ฌ ์คํ๋๊ณ ์๋ ํจ์ ์ด๋ฆ |
TERM | ๋ก๊ทธ์ธ ํฐ๋ฏธ๋ |
์ด์ธ์ ๋ณ์ ๋ช ๋ น์ด
- set : ์ ธ ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- env : ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- export : ํน์ ๋ณ์์ ๋ฒ์๋ฅผ ํ๊ฒฝ ๋ณ์์ ๋ฐ์ดํฐ ๊ณต๊ฐ์ผ๋ก ์ ์กํ์ฌ ์์ ํ๋ก์ธ์ค์์๋ ํน์ ๋ณ์๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ์ ์ญ ๋ณ์์ ๊ฐ๋
- unset : ์ ์ธ๋ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ค.
์ ์ด์ค์ผ์ดํ ๋ฌธ์
- \f : ์ ๋ฌธ์์ด๋งํผ ์ด์ ๋ฐ์ด์ ์ด๋
- \n : ์๋ก์ด ์ค๋ก ๋ฐ๊พผ๋ค
- \r : ์ ๋ฌธ์์ด์ ์๋ถ๋ถ๋ถํฐ ๋ท๋ฌธ์์ด ๋งํผ ๋์ฒดํ๊ณ ๋ฐํํ๋ค.
- \t : ํญ ๋งํผ ๋์ด๋ค.
์ ์ฐ์ ์ฐ์ฐ
์ ์คํฌ๋ฆฝํธ์ ๋ณ์ ์ฐ์ ์ฐ์ฐ์ ๋ค๋ฅธ ์ธ์ด์ ๋นํด ๊ฐ๋จ์น ์๋ค.
์์ ๋งํ๋ฏ์ด Bash ๋ณ์๋ ๋ณธ์ง์ ์ผ๋ก ๋ฌธ์์ด์ด๋ผ ๋ณ๋์ ํน์ํ ๋ฌธ๋ฒ์ ์ฌ์ฉํด ์ฐ์ฐ์ ํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด Bash๊ฐ ์์์ ํ๋ณํ ํ์ฌ ์ ์ ์ฐ์ฐ์ด๋ ๋ณ์๋ฅผ ๋น๊ตํด ์ค๋ค.
Bash์์๋ ๊ณ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ค์ 3๊ฐ์ง ๋ฌธ๋ฒ์ ์ ๊ณตํ๋ค.
- expr
- let
- $(( ))
expr ์ฐ์ฐ์
- expr๋ ์ญ๋ฐ์ดํ๋ฅผ ๋ฐ๋์ ๊ฐ์ธ์ค๋ค. ์ญ๋ฐ์ดํ ๋์ $(( )) ํด์ค๋ ๋์์ ํ๋ค.
- expr์ ์ฌ์ฉํ ๋ ํผ์ฐ์ฐ์์ ์ฐ์ฐ์ ์ฌ์ด์ ๊ณต๋ฐฑ์ด ํ์ํ๋ค.
- ์ฐ์ ์ฐ์ฐํ ๋ ์ฐ์ ์์๋ฅผ ์ง์ ํ๊ธฐ์ํด ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด \์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
- ๊ณฑ์ ๋ฌธ์ *๋ \์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
#!/bin/bash
number1=10
number2=20
plus=`expr $number1 + $number2`
minus=`expr $number1 - $number2`
mul=`expr $number1 \* $number2` # ๊ณฑ์
์๋ \* ๋ฅผ ์ด์ฉํ๋ค.
div=`expr $number1 / $number2`
rem=`expr $number1 % $number2`
echo "plus: ${plus}"
echo "minus: ${minus}"
echo "mul: ${mul}"
echo "div: ${div}"
echo "rem: ${rem}"
$ ./script.sh
plus: 30
minus: -10
mul: 200
div: 0
rem: 10
# ์ฐ์ ์์ ์ฐ์ ์ฐ์ฐ์ ํ ๋๋ ๊ดํธ๋ฅผ ๋ฌธ์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
# ์ฐ์ฐ์ *์ ๊ดํธ() ์์๋ ์ญ์ฌ๋์์ ๊ฐ์ด ์ฌ์ฉ
num=`expr \( 3 \* 5 \) / 4 + 7`
echo $num
let ์ฐ์ฐ์
num1=42
num2=9
let re=num1+num2 #Add
echo "add:$re"
let re=num1-num2 #Sub
echo "sub:$re"
let re=num1*num2 #Mul
echo "mul:$re"
let re=num1/num2 #Div
echo "div:$re"
let re=num1%num2 #Mod
echo "mod:$re"
$ ./script.sh
add:51
sub:33
mul:378
div:4
mod:6
$(( )) ์ฐ์ฐ์
num1=42
num2=9
echo add:$((num1+num2))
echo sub:$((num1-num2))
echo mul:$((num1*num2))
echo div:$((num1/num2))
echo mod:$((num1%num2))
$ ./script.sh
add:51
sub:33
mul:378
div:4
mod:6
์ ์ฃผ์
์์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ๋ ํ ์ค์ ์ฝ๊ฒ '#'๋ฅผ ํตํด ์ฃผ์์ด ๊ฐ๋ฅํ์ง๋ง,
๋ธ๋ก์ ์ฃผ์ํ๊ธฐ ์ํด์๋ ์์ ํ ๋ค๋ฅธ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
:<<"END" ์ด ๊ตฌ๊ฐ๋ถํฐ ์ฃผ์์ด ์์๋๋ ๋ธ๋ก์ด๊ณ , END ๋ก ์ฃผ์์ด ๋๋๋ ๋ธ๋ก์ ๋ช ์ํด ์ฃผ๋ฉด ๋๋ค.
echo "์ฌ๊ธฐ๋ ์ถ๋ ฅ๋๋ค."
#echo " ์ฌ๊ธฐ๋ ์ฃผ์์ฒ๋ฆฌ"
<์ฝ๋๋ผ์ธ>
: << "END" #์ฃผ์ ์์
echo "์ฌ๊ธฐ์๋ถํฐ "
echo "test_01"
echo "test_02"
echo "test_03"
echo "test_04"
echo "test_05"
echo "test_06"
echo "test_07"
echo "์ฌ๊ธฐ๊น์ง ์ฃผ์์ฒ๋ฆฌ ๋จ"
END #์ฃผ์ ๋
echo "์ฌ๊ธฐ๋ ์ฃผ์์ด ์๋์ด ์์ด ์ถ๋ ฅ "
vi ์๋ํฐ๋ก ์ฌ๋ฌ์ค ์ฃผ์ ๋ฐฉ๋ฒ
๊ธฐ๋ณธ ์ฌ๋ฌ์ค ์ฃผ์ ๋ฌธ๋ฒ์ด ๋ณ๋ก๋ผ๋ฉด, vi ๋จ์ถํค๋ฅผ ์ด์ฉํ ์ฃผ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ์๋ค.
- vi ํธ์ง๊ธฐ๋ฅผ ์ด๊ณ ctrl + v๋ฅผ ๋๋ฌ ๋น์ฃผ์ผ ๋ชจ๋๋ก ์ง์ ํ๋ค. (๋น์ฃผ์ผ ๋ชจ๋๋ vim ์ด ์ค์น ๋์ด ์์ด์ผ ํ๋ค.)
- ์ฃผ์์ ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ๋ผ์ธ๊น์ง ๋ฐฉํฅํค ๋๋ vi๋ฐฉํฅํค๋ฅผ ์ด์ฉํ์ฌ ์ด๋ํ๋ค.
- shift + i ๋๋ฅด๊ณ #์ ์ ๋ ฅํ๋ค.
- esc ํค๋ฅผ ์ฌ๋ฌ๋ฒ ๋๋ฅธ๋ค.
- ์ฃผ์ ์ฒ๋ฆฌ ๋จ์ ํ์ธํ๋ค.

์ ์กฐ๊ฑด๋ฌธ
if ๋ฌธ
๋ฐฐ์ฌ์ if๋ฌธ์ ํน์ดํ ์ ์ fi ์ ๋๊ดํธ[ ] ์ด๋ค.
์ฌํ ์ธ์ด์ ๋ฌ๋ฆฌ ์ค๊ดํธ๋ฅผ ์์ฐ๊ธฐ ๋๋ฌธ์ fi๋ก if๋ฌธ์ ๋์ ์๋ ค์ฃผ์ด์ผ ํ๋ฉฐ,
์ฃผ์ํด์ผํ ์ ์ if๋ฌธ ๋ค์ ๋์ค๋ ๋๊ดํธ [ ] ์ ์กฐ๊ฑด์ ์ฌ์ด์๋ ๋ฐ๋์ ๊ณต๋ฐฑ์ด ์กด์ฌํด์ผ ํ๋ค.
if [ ๊ฐ1 ์กฐ๊ฑด์ ๊ฐ2 ]
then
์ํ1
else
์ํ2
fi
# ๊ฐ๋
์ฑ ์ข๊ธฐ ์ํด then์ if [] ์ ๋ถ์ฌ์ฐ๋ ค๋ฉด ๋ฐ๋์ ์ธ๋ฏธ์ฝ๋ก ; ์ ์จ์ผํ๋ค.
if [ ๊ฐ1 ์กฐ๊ฑด์ ๊ฐ2 ]; then
์ํ1
else
์ํ2
fi
๋น๊ต ์ฐ์ฐ
๋ฌธ์1 = ๋ฌธ์2 # ๋ฌธ์1 ๊ณผ ๋ฌธ์2๊ฐ ์ผ์น (sql๊ฐ์ด = ํ๋๋ง ์จ๋ ์ผ์น๋ก ์ธ์)
๋ฌธ์1 == ๋ฌธ์2 # ๋ฌธ์1 ๊ณผ ๋ฌธ์2๊ฐ ์ผ์น
๋ฌธ์1 != ๋ฌธ์2 # ๋ฌธ์1 ๊ณผ ๋ฌธ์2๊ฐ ์ผ์นํ์ง ์์
-z ๋ฌธ์ # ๋ฌธ์๊ฐ null ์ด๋ฉด ์ฐธ
-n ๋ฌธ์ # ๋ฌธ์๊ฐ null ์ด ์๋๋ฉด ์ฐธ
๋ฌธ์ == ํจํด # ๋ฌธ์์ด์ด ํจํด๊ณผ ์ผ์น
๋ฌธ์ != ํจํด # ๋ฌธ์์ด์ด ํจํด๊ณผ ์ผ์นํ์ง ์์
๊ฐ1 -eq ๊ฐ2 # ๊ฐ์ด ๊ฐ์(equal)
๊ฐ1 -ne ๊ฐ2 # ๊ฐ์ด ๊ฐ์ง ์์(not equal)
๊ฐ1 -lt ๊ฐ2 # ๊ฐ1์ด ๊ฐ2๋ณด๋ค ์์(less than)
๊ฐ1 -le ๊ฐ2 # ๊ฐ1์ด ๊ฐ2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์(less or equal)
๊ฐ1 -gt ๊ฐ2 # ๊ฐ1์ด ๊ฐ2๋ณด๋ค ํผ(greater than)
๊ฐ1 -ge ๊ฐ2 # ๊ฐ1์ด ๊ฐ2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์(greater or equal)
if [ ${a} -eq ${b} ]; then
echo "a์ b๋ ๊ฐ๋ค."
fi
if [ ${a} -ne ${b} ]; then
echo "a์ b๋ ๊ฐ์ง ์๋ค."
fi
if [ ${a} -gt ${b} ]; then
echo "a๊ฐ b๋ณด๋ค ํฌ๋ค."
fi
if [ ${a} -ge ${b} ]; then
echo "a๊ฐ b๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค."
fi
if [ ${a} -lt ${b} ]; then
echo "a๊ฐ b๋ณด๋ค ์๋ค."
fi
if [ ${a} -le ${b} ]; then
echo "a๊ฐ b๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค."
fi
# ํ์ค๋ก ์์ฑ
if [ ${num1} -lt ${num2} ]; then echo "yes"; fi
num1=35
num2=48
# ์ด์ค ์๊ดํธ๋ฅผ ์ฐ๋ฉด ์กฐ๊ฑด๋ฌธ์ ๋ฌธ์ ๋์ ๊ธฐํธ๋ก ํํ ๊ฐ๋ฅํ๋ค. ๋จ, ์๊ดํธ ์์ ๋ฐ์ดํ ์ฐ๋ฉด ์๋๋ค.
if (( ${num1} < ${num2} )); then
echo "yes"
fi
if (( ($num1 * $num2) - $num2 > 200 )); then
echo ">200"
else
echo "<200"
fi
์ด์ค ๊ดํธ (( expression ))
expression ์๋ ์์์ด๋ ๋น๊ต ํํ์์ด ๋ค์ด๊ฐ ์ ์๋ค.
! ๋ ผ๋ฆฌ ๋ถ์
~ ๋นํธ ๋ถ์
** ์ง์ํ
<< ๋นํธ ์ผ์ชฝ ์ฌํํธ
>> ๋นํธ ์ค๋ฅธ์ชฝ ์ฌํํธ
& ๋นํธ ๋จ์AND
| ๋นํธ ๋จ์ OR
&& ๋ ผ๋ฆฌ AND
|| ๋ ผ๋ฆฌ OR
num++ ํ์์ฆ๊ฐ
num-- ํ์๊ฐ์++
num ์ ์์ฆ๊ฐ
--num ์ ์๊ฐ์
ํ์ผ ๊ฒ์ฌ

if [ -d ${๋ณ์} ]; then # ${๋ณ์}์ ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ๋ฉด ์ฐธ
if [ ! -d ${๋ณ์} ]; then # ${๋ณ์}์ ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์ฐธ
if [ -e ${๋ณ์} ]; then # ${๋ณ์}๋ผ๋ ํ์ผ์ด ์กด์ฌํ๋ฉด ์ฐธ
if [ ! -e ${๋ณ์} ]; then # ${๋ณ์}๋ผ๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ฐธ
if [ -r ${๋ณ์} ]; then # ํ์ผ์ ์ฝ์ ์ ์์ผ๋ฉด ์ฐธ
if [ -w ${๋ณ์} ]; then # ํ์ผ์ ์ธ ์ ์์ผ๋ฉด ์ฐธ
if [ -x ${๋ณ์} ]; then # ํ์ผ์ ์คํํ ์ ์์ผ๋ฉด ์ฐธ
if [ -s ${๋ณ์} ]; then # ํ์ผ์ ํฌ๊ธฐ๊ฐ 0๋ณด๋ค ํฌ๋ฉด ์ฐธ
if [ -L ${๋ณ์} ]; then # ํ์ผ์ด symbolic link์ด๋ฉด ์ฐธ
if [ -S ${๋ณ์} ]; then # ํ์ผ ํ์
์ด ์์ผ์ด๋ฉด ์ฐธ
if [ -f ${๋ณ์} ]; then # ํ์ผ์ด ์ ๊ท ํ์ผ์ด๋ฉด ์ฐธ
if [ -c ${๋ณ์} ]; then # ํ์ผ์ด ๋ฌธ์ ์ฅ์น์ด๋ฉด ์ฐธ
if [ ${๋ณ์1} -nt ${๋ณ์2}]; then # ๋ณ์1์ ํ์ผ์ด ๋ณ์2์ ํ์ผ๋ณด๋ค ์ต์ ํ์ผ์ด๋ฉด ์ฐธ
if [ ${๋ณ์1} -ot ${๋ณ์2}]; then # ๋ณ์1์ ํ์ผ์ด ๋ณ์2์ ํ์ผ๋ณด๋ค ์ต์ ์ด ์๋๋ฉด ์ฐธ
if [ ${๋ณ์1} -ef ${๋ณ์2}]; then # ๋ณ์1์ ํ์ผ๊ณผ ๋ณ์2์ ํ์ผ์ด ๋์ผํ๋ฉด ์ฐธ
๋ ผ๋ฆฌ ์ฐ์ฐ
์กฐ๊ฑด1 -a ์กฐ๊ฑด2 # AND
์กฐ๊ฑด1 -o ์กฐ๊ฑด2 # OR
์กฐ๊ฑด1 && ์กฐ๊ฑด2 # ์์ชฝ ๋ค ์ฑ๋ฆฝ
์กฐ๊ฑด1 || ์กฐ๊ฑด2 # ํ์ชฝ ๋๋ ์์ชฝ๋ค ์ฑ๋ฆฝ
!์กฐ๊ฑด # ์กฐ๊ฑด์ด ์ฑ๋ฆฝํ์ง ์์
true # ์กฐ๊ฑด์ด ์ธ์ ๋ ์ฑ๋ฆฝ
false # ์กฐ๊ฑด์ด ์ธ์ ๋ ์ฑ๋ฆฝํ์ง ์์
if [ -f ${file1} -a -f ${file2} ]; then
echo 'file1๊ณผ file2๋ ๋ชจ๋ ํ์ผ์
๋๋ค.'
else
echo 'file1๊ณผ file2๊ฐ ๋ชจ๋ ํ์ผ์ธ ๊ฒ์ ์๋๋๋ค.'
fi
if [ -f ${a} -a -d ${b} ]; then
echo "a๋ ํ์ผ์ด๊ณ b๋ ๋๋ ํ ๋ฆฌ"
fi
VALUE=10
if [ ${VALUE} -gt 5 -a ${VALUE} -lt 15 ] ; then
echo "VALUE is greater than 5 and less than 15!"
fi
# ๋์ด ๊ฐ์ ๋ฌธ์ฅ์ด๋ค.
if [ ${VALUE} -gt 5 ] && [ ${VALUE} -lt 15 ] ; then
echo "VALUE is greater than 5 and less than 15!"
fi
# ๋๊ดํธ ๋๊ฐ๋ฅผ ์จ์ ํํํ ์ ๋ ์๋ค.
if [[ ${VALUE} -gt 5 && ${VALUE} -lt 15 ]] ; then
echo "VALUE is greater than 5 and less than 15!"
fi
# AND
if [ ${string1} == ${string2} ] && [ ${string3} == ${string4} ] ;
then
# OR
if [ ${string1} == ${string2} ] || [ ${string3} == ${string4} ];
then
# ๋ค์ค ์กฐ๊ฑด
if [[ ${string1} == ${string2} || ${string3} == ${string4} ]] && [ ${string5} == ${string6} ];
then
์ด์ค ๋๊ดํธ
[[ "1.8.3" == 1.7.* ]]
&&, ||, = ~ * (์ ๊ท์ ๋งค์นญ) ๊ณผ ๊ฐ์ ํ์ฅ expression test ๊ธฐ๋ฅ์ ๋๊ดํธ ๋ด์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
๊ทธ๋ฅ ๋๊ดํธ์ ๊ฐ์ ๋ฒ์ ผ ์ ๋๋ก ์๊ฐํ๋ฉด ๋๋ค.
if elif else ๋ฌธ
#!/bin/bash
num1="10"
num2="10"
if [ ${num1} -lt ${num2} ]; then # "-lt", A๊ฐ B๋ณด๋ค ์์ผ๋ฉด True
echo "yes"
elif [ ${num1} -eq ${num2} ]; then # "-eq", A์ B๊ฐ ์๋ก ๊ฐ์ผ๋ฉด True
echo "bbb"
else
echo "no"
fi
# ์ด์ค ์๊ดํธ๋ฅผ ์ฐ๋ฉด ๋
ผ๋ฆฌ์ฐ์ฐ์ ๊ธฐํธ ์ฌ์ฉ ๊ฐ๋ฅ
if (( ${num1} < ${num2} )); then
echo "yes"
elif (( ${num1} == ${num2} )); then
echo "bbb"
else
echo "no"
fi
# ํ์ค ์์ฑ
if [ ${num1} -lt ${num2} ]; then echo "yes"; elif [ ${num1} -eq ${num2} ]; then echo "bbb"; else echo "no"; fi
$ ./script.sh
bbb
bbb
bbb
bbb
case ๋ฌธ
C์ธ์ด์ switch case ๋ฌธ๋ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.

๋์ , ๋ฆฌ๋ ์ค Bash์ switch๋ฌธ ํน์ง์ด๋ผ๋ฉด ๊ฐ case์ ๋์ ๋ณด๋ฉด ์ธ๋ฏธ์ฝ๋ก 2๊ฐ๋ก ์ข ๋ฃํ๋ค.
๊ฑฐ๊ธฐ๋ค case๋ฌธ ๋ง์ ๊ฐ๋ ฅํ ํน์ง์ด ์๋๋ฐ ๋ฐ๋ก ํจํด์ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด๋ค.
case ๋ฌธ์์ด in
๊ฒฝ์ฐ1)
๋ช
๋ น ๋ช
๋ น ๋ช
๋ น
;;
๊ฒฝ์ฐ2)
๋ช
๋ น ๋ช
๋ น ๋ช
๋ น
;;
* )
๋ช
๋ น ๋ช
๋ น ๋ช
๋ น
;;
esac
case ${var} in
"linux") echo "๋ฆฌ๋
์ค" ;; # ๋ณ์var๊ฐ์ด linux๋ผ๋ฉด ์คํ
"unix") echo "์ ๋์ค" ;;
"windows") echo "์๋์ฐ์ฆ" ;;
"MacOS") echo "๋งฅOS" ;;
*) echo "๋จธ์ผ" ;; # default ๋ถ๋ถ
esac
COUNTRY=korea
case $COUNTRY in
"korea"|"japan"|"china") # or ์ฐ์ฐ๋ ๊ฐ๋ฅํ๋ค
echo "$COUNTRY is Asia"
;;
"USA"|"Canada"|"Mexico")
echo "$COUNTRY is Ameria"
;;
* )
echo "I don't know where is $COUNTRY"
;;
esac
date=210610 # 21๋
6์ 10์ผ
case $date in # ? ๋ ์์์ ํ๋ฌธ์
??03?? | ??04?? | ??05??) echo ๋ด์ด๊ตฌ๋~! ;; # 3์์ด๊ฑฐ๋ 4์์ด๊ฑฐ๋ 5์์ผ ๋
??06?? | ??07?? | ??08??) echo ์ฌ๋ฆ์ด๊ตฌ๋~! ;;
??09?? | ??10?? | ??11??) echo ๊ฐ์์ด๊ตฌ๋~! ;;
??12?? | ??01?? | ??02??) echo ๊ฒจ์ธ์ด๊ตฌ๋~! ;;
*) echo ์ ์ผํ๊ธฐ ์ซ๋ค ;;
esac
str="abc"
case $str in
a*) # a์ดํ ์์์ ์ด๋ ํ ๋ฌธ์๋ผ๋ ์ค๋ฉด ์ผ์น (0๊ฐ~์ฌ๋ฌ๊ฐ)
echo "$str starts with a"
;;
a?) # a์ดํ ๋ฐ๋์ ์์์ ํ๋์ ๋ฌธ์๊ฐ ์ค๋ฉด ์ผ์น
echo "$str starts with a and has two words"
;;
a[bc]) # a์ดํ b๋ c๊ฐ ์ค๋ฉด ์ผ์น
echo "$str starts with a and then followed by b or c "
;;
* ) # default
echo "I don't know where is $COUNTRY"
;;
esac
์ ๋ฐ๋ณต๋ฌธ
for ๋ฌธ
#!/bin/bash
# ์ด๊ธฐ๊ฐ; ์กฐ๊ฑด๊ฐ; ์ฆ๊ฐ๊ฐ์ ์ฌ์ฉํ ์ ํต์ ์ธ for๋ฌธ
for ((i=1; i<=4; i++)); do
echo $i
done
๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ ๋๊ฐ๋ : break
ํ์ฌ ๋ฐ๋ณต๋ฌธ์ด๋ ์กฐ๊ฑด์ ๊ฑด๋ ๋ธ๋ : continue
for in ๋ฌธ
#!/bin/bash
# ๋ฃจํ ๋ ๋ฐ์ดํฐ์ ๋์ด์ฐ๊ธฐ๊ฐ ์์ผ๋ฉด ๊ฐ๊ฐ ๋์
for x in 1 2 3 4 5
do
echo "${x}"
done
# ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ
data="1 2 3 4 5"
for x in $data
do
echo ${x}
done
# ๋ฐฐ์ด์ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ
arr=(1 2 3 4 5)
for i in "${arr[@]}" # arr[@] : ๋ฐฐ์ด ์ ์ฒด ์ถ๋ ฅ
do
echo "${i}"
done
# sequence๋ฅผ ํตํ for๋ฌธ. seq๋ผ๋ ํ๋ก์ธ์ค๊ฐ ์์๋๋ก ์ซ์๋ฅผ ์ถ๋ ฅํด ์ฃผ๋ ์ญํ ์ bash์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
for num in `seq 1 5`
do
echo $num
done
# range๋ฅผ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ. {..} ์ค๊ดํธ์ ์ ๋๊ฐ๋ฅผ ์ฐ๋ฉด range์ฒ๋ฆฌ๊ฐ ๋๋ค.
for x in {1..5}
do
echo ${x}
done
# ํ์ผ ๋ฆฌ์คํธ ์ถ๋ ฅ
for line in `ls` # ์ญ๋ฐ์ดํ ์จ์ ls๋ฅผ ๋ฌธ์๊ฐ ์๋ ํ๋์ ๋ช
๋ น์ด๋ก ์คํ
do
echo $line # ํด๋น ์์น์ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ค์ด ์ถ๋ ฅ
done
# ํ์ค ๋ฌธ๋ฒ (ํ์ค๋ก ์ฐ๋ฉด ํฐ๋ฏธ๋์์ ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ ํ ์ ์๋ค)
for line in `ls`; do echo $line; done
์ธ๋ฏธ์ฝ๋ก ; ์ ์๋ ์ํฐํ๊ณ ์์ฑํ๋๊ฑธ ํ์ค๋ก ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ผ๋ก ์ดํดํด๋ ๋๋ค.
์ธ๋ฏธ์ฝ๋ก ์ ๋ช ๋ น๊ณผ ๋ช ๋ น์ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ค.

for var in $*
do
echo $var
done
--------------------------------------------------
# ์ ์ธ์๋ฅผ ํตํ ์ถ๋ ฅ
$ ./test.sh 1 2 3 4 5
1
2
3
4
5
while ๋ฌธ
count=0
while [ ${count} -le 5 ];
do
echo ${count}
count=$(( ${count}+1 ))
done
count=0
while (( ${count} <= 5 )); # ์ด์ค๊ดํธ ์ฌ์ฉํ๋ฉด ๋
ผ๋ฆฌ๊ธฐํธ ์ฌ์ฉ ๊ฐ๋ฅ
do
echo ${count}
count=$(( ${count}+1 ))
done
$ ./script.sh
0
1
2
3
4
5
unitil ๋ฌธ
- ์ํ ์กฐ๊ฑด์ด false ์ผ๋ ์คํ๋๋ ๋ฃจํ๋ฌธ์ด๋ค.
- ํ๋ค๋ฏธ๋ก while์ ๋ฐ๋๋ฒ์ ผ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. (while์ ์กฐ๊ฑด์ด true ๋ฉด ๋ฃจํ)
count2=10
until [ ${count2} -le 5 ]; do
echo ${count2}
count2=$(( ${count2}-1 ))
done
$ ./script.sh
10
9
8
7
6
์ ๋ฐฐ์ด๋ฌธ
๋ฐฐ์ด ์์ฑ / ์ถ๊ฐ
#!/bin/bash
# ๋ฐฐ์ด์ ํฌ๊ธฐ ์ง์ ์์ด ๋ฐฐ์ด ๋ณ์ ์ ์ธ
# ๊ตณ์ด 'declare -a' ๋ช
๋ น์ผ๋ก ์ ์ธํ์ง ์์๋ ๋ฐ๋ก ๋ฐฐ์ด ๋ณ์ ์ฌ์ฉ ๊ฐ๋ฅํจ
declare -a array
arr=("test1" "test2" "test3") # ๋ฐฐ์ด ์ ์ธ ๋ฐ ์ง์
echo ${arr[0]} # test1
# ๊ธฐ์กด ๋ฐฐ์ด์ 1๊ฐ์ ๋ฐฐ์ด ๊ฐ ์ถ๊ฐ 3๊ฐ์ง ๋ฐฉ๋ฒ
arr[3]="test4"
arr+=("test5")
arr[${#arr[@]}]="test6" # ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํด push
echo ${arr[@]} # arr์ ๋ชจ๋ ๋ฐ์ดํฐ ์ถ๋ ฅ
echo ${arr[*]} # arr์ ๋ชจ๋ ๋ฐ์ดํฐ ์ถ๋ ฅ
echo ${#arr[@]} # arr ๋ฐฐ์ด ๊ธธ์ด ์ถ๋ ฅ
echo ${arr[@]:2:3} # 2๋ถํฐ 3๊ฐ์ ์์
$ ./script.sh
test1
test1 test2 test3 test4 test5 test6
test1 test2 test3 test4 test5 test6
6
test3 test4 test5
๋ฆฌ๋ ์ค ์์ 1์ฐจ์ ๋ฐฐ์ด๋ง ์ง์ํ๋ค.
๋ฐฐ์ด ์์ ์ญ์
- /๋ฅผ ์ฌ์ฉํด ํด๋น ๋ฌธ์์ด ๋ถ๋ถ์ด ์์ผ๋ฉด ์ญ์ ํ ์ ์๋ค.
- ๋ค๋ง unset์ ์ด์ฉํด ์ญ์ ๋ฅผ ๊ถ๊ณ ํ๋ ํธ์ด๋ค.
arr=(1 2 3)
remove_element=(3)
arr=( "${arr[@]/$remove_element}" ) # ๋ฐฐ์ด 1 2 3 ์์ / 3์ ์์ฐ
echo ${arr[@]} # > 1 2
arr=("abc" "def" "defghi")
unset arr[1] # ๋ฐฐ์ด ํน์ ์ธ๋ฑ์ค ์์ ์ญ์
echo ${arr[@]} > # abc defghi
unset array # ๋ฐฐ์ด ์ ์ฒด ์ง์ฐ๊ธฐ
์ฐ๊ด๋ฐฐ์ด (MAP)
key์ value ํ์ ์ผ๋ก ์ ์ฅ๋ ๋ฐฐ์ด์ ๋งํ๋ค.
ํ๋ก๊ทธ๋๋ฐ ๊ณ ๊ธ์ธ์ด์์ ์์ฃผ ๋ฑ์ฅํ๋ ์๋ฃํ ํ์ ์ธ๋ฐ, PHP์ ์ฐ๊ด๋ฐฐ์ด, ํ์ด์ฌ์ ๋์ ๋๋ฆฌ, ์๋ฐ์คํฌ๋ฆฝํธ์ MAP ์๋ฃํ ์ด๋ผ๊ณ ๋ด๋ ๋๋ค.
# ์ฐ๊ด๋ฐฐ์ด ์์ฑ
declare -A map=([hello]='world' [long]='long long long string' [what is it]=123)
declare -p map # ์ฐ๊ด๋ฐฐ์ด ์ ๋ณด ์ถ๋ ฅ
# > declare -A map=([long]="long long long string" ["what is it"]="123" [hello]="world" )
echo "map[hello]=${map[hello]}"
# > map[hello]=world
key=hello # ๋ณ์๋ฅผ ์ธ๋ฑ์ค๋ก ๋ฃ์ด์ค๋ ๋๋ค. (MAP์ ํน์ฑ)
echo "map[key]=${map[${key}]}"
# > map[key]=world
# ์ฐ๊ด๋ฐฐ์ด value ๊ฐ ๋ชจ๋ ์ถ๋ ฅ (MAP์ ์์๋ฅผ ๋ณด์ฅํ์ง์๋๋ค)
echo "all=${map[@]}" # > long long long string 123 world
# ์ฐ๊ด๋ฐฐ์ด key ์ธ๋ฑ์ค ๋ชจ๋ ์ถ๋ ฅ (MAP์ ์์๋ฅผ ๋ณด์ฅํ์ง์๋๋ค)
echo "keys=${!map[@]}" # > long what is it hello
# ์ฐ๊ด๋ฐฐ์ด ๊ธธ์ด ์ถ๋ ฅ
echo "length=${#map[@]}" # > length=3
# ์์ ์ถ๊ฐ
map+=([key1]=value)
map+=([key2]=value2 [key3]=value3)
map+=(['long key']='long long long value')
map['like a C++']='value!!!!!'
# ์์ ์ญ์ (ํค๋ก ์ญ์ )
unset 'map[intput1]'
# ๋ฃจํ1: ์์ฐจ์ ์ผ๋ก ์ ๊ทผ
for i in "${map[@]}"; do
echo "${i}"
done
# long long long string
# 123
# world
# ๋ฃจํ2: ํค๋ก ์ ๊ทผ
for key in "${!map[@]}"; do
echo "map[${key}]=${map[${key}]}"
done
# map[long]=long long long string
# map[what is it]=123
# map[hello]=world
์ ์ธํ๊ฐ ์ ๋ ฅ๋ฐ๊ธฐ
C์ธ์ด์ scanf() ๊ฐ์ด ํฐ๋ฏธ๋์์ ์ฌ์ฉ์๋ก๋ถํฐ ์ธ์๋ฅผ ์ ๋ ฅ ๋ฐ์ ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค.
echo -n "String input : "
read [๋ณ์๋ช
] # <- ํฐ๋ฏธ๋์์ ์
๋ ฅ๋ ์ธํ๊ฐ์ด ๋ณ์์ ์ ์ฅ๋๊ฒ ๋๋ค.
echo "user input : $๋ณ์๋ช
# ์
๋ ฅ๋ ๊ฐ ์ถ๋ ฅ


์ ํจ์(Function)
๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌ๋ฆฌ ์ ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ช ์ function์ ์จ์ฃผ์ง ์์๋ ์์์ ์ธ์๋๋ค. ๋ํ, ํจ์๋ฅผ ํธ์ถํ ๋๋ ๊ดํธ๋ฅผ ์จ์ฃผ์ง ์๊ณ ํธ์ถํด์ผํ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ ํธ์ถ ์ฝ๋๋ ํจ์ ์ฝ๋๋ณด๋ค ๋ฐ๋์ ๋ค์ ์์ด์ผ ๋๋ค. ํจ์ ์ฝ๋ ๋ณด๋ค ์์์ ํธ์ถ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
#!/bin/bash
func(){
echo "func()"
}
function string_test() {
echo "string test"
echo "์ธ์๊ฐ: ${@}"
}
#ํจ์ ํธ์ถ
func
# ํจ์์ ์ธ์๊ฐ ์ ๋ฌํ๊ธฐ(๊ณต๋ฐฑ์๋ก ๋ฐ์ด์ 2๊ฐ์ ์ธ์๊ฐ์ ๋๊น)
string_test "hello" "world"
$ ./script.sh
func()
string test
์ธ์๊ฐ: hello world
ํจ์ ์๊ท๋จผํธ
ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ดํ ์ธ์๋ค์ ํ๋์ฉ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋ฃ์ด์ค ์ธ์๋ค์ ํจ์ ๋ด๋ถ์์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ฐ,
๋ํ์ ์ผ๋ก๋ $1, $2์ฒ๋ผ ์ธ์๊ฐ ๋ค์ด์จ ์์๋๋ก ์ ๋ ฅ์ ๋ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
function test3()
{
param1=$1
param2=$2
echo $param1 # a
echo $param2 # b
echo $@ # ํ๋ผ๋ฏธํฐ ์ ์ฒด ์ถ๋ ฅ
}
test3 "a" "b"
๋ช ๋ น์ด ์ข ๋ฃ ์ํ ์ฝ๋
์ข ๋ฃ ์ฝ๋๋, exit ๋ช ๋ น์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค๋ฉด์ ์ฌ์ฉ์์๊ฒ ํ๋ก๊ทธ๋จ ์ข ๋ฃ์ ์ด์ ๋ฅผ ์๋ฆฌ๊ธฐ ์ํ์ฌ ๋ฐํํ๋ ๊ฐ์ด๋ค.
์ ์คํฌ๋ฆฝํธ ๋ด์์ exit ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋๋ฉฐ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ข ๋ฃ ์ํ๋ฅผ ์ ๋ฌํ ์ ์๋๋ฐ ์ด ๊ฐ์ ํ๋ก๊ทธ๋จ ๋ด์์ ์์๋ก ์ง์ ํ ์๋ ์๋ค.
#!/bin/bash
exit 16 # ๊ฐ์ ์ข
๋ฃ
echo "wtf" # ์คํ์๋จ

์ข ๋ฃ ์ํ๋ ๋ฆฌํด๊ฐ(return value, return status)์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋๋ฐ, ์ด์ ์ ์ํํ๋ ๋ช ๋ น์ด๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ ๋ ๋ ๋๊ฒจ์ฃผ๋ ๊ฐ์ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
์ข ๋ฃ ์ํ ๋๋ ๋ฐํ๊ฐ์ด ์ค์ํ ์ด์ ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋๋ฐ ์์ด์ ํน์ ๋ช ๋ น์ด์ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ผ ๋ถ๊ธฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ช ๋ น์ด๊ฐ ์ ์์ ์ผ๋ก ์ํ๋์๋์ง ์๋ ๊ฒ์ด ํ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด ์ฌํ ํ๋ก๊ทธ๋๋ฐ ๊ณ ๊ธ์ธ์ด์์ , If ๋ฌธ์์ ์ฐธ/๊ฑฐ์ง์ ํ๋จํ ๋ 0์ด ๊ฑฐ์ง์ด๊ณ ๊ทธ ์ธ ๊ฐ์ ์ฐธ์ผ๋ก ์ธ์ ํ๋๋ฐ, ํน์ดํ๊ฒ Bash shell ์์๋ ๋ฐ๋๋ก ์๊ฐํด์ผ ๋๋ค.
์ฆ, 0 : ํ๋ก๊ทธ๋จ์ ์ ์์ข ๋ฃ , ๊ทธ ์ธ์ ์ซ์ : ์ค๋ฅ ์ธ ์ ์ด๋ค.
์ด๋ฌํ ํน์ง์ ์ด์ฉํด์, ๋ง์ผ ๋ช ๋ น์ด๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ ์ข ๋ฃ ์ํ ์ฝ๋๋ฅผ ์ป์ด์ if๋ฌธ์์ -eq 0์ ํตํด ๊ฒ์ฌํด์ ๋ถ๊ธฐ๋ฌธ์ ๊ตฌ์ถํ ์ ์๊ฒ ๋๋ค.
์ข ๋ฃ ์ํ ๊ฐ์ ์์์ ๋ฐฐ์ด $? ์ผ๋ก ํ์ธํ ์ ์๋ค.
$ date -@ # ์ธ์๋ฅผ ์๋ชป ์ฌ์ฉํ์ฌ ์ผ๋ถ๋ฌ ๋ช
๋ น์ด ์ค๋ฅ๋ฐ์ ์ํด -> ์ข
๋ฃ ์ํ ์ฝ๋ 1 ๋ฐํ
date: invalid option -- '@'
Try 'date --help' for more information.
$ echo $? # 0 ์ด ์๋ ์ข
๋ฃ ์ํ ๊ฐ์ ๋ชจ๋ ๊ฑฐ์ง์ ํด๋น
1
$ date +%Y # ์ ์์ ์ธ ๋ช
๋ น์ด ์คํ -> ์ข
๋ฃ ์ํ ์ฝ๋ 0 ๋ฐํ
2015
$ echo $? # ์ ์์ข
๋ฃ ๋์ผ๋ฏ๋ก 0 ์ ๋ฆฌํด. ์ฐธ
0
#!/usr/bin/bash
$ date -@ # ๋ช
๋ น์ด ์คํจ -> $? ์ ์ํ ์ฝ๋ 1์ด ๋ค์ด๊ฐ
# $?(์ํ ์ฝ๋)๋ฅผ ์กฐ๊ฑด๋ฌธ์์ ๊ฒ์ฌํจ. ๋ง์ผ ์ฑ๊ณต ์ฝ๋(0) ์ผ๊ฒฝ์ฐ ์คํ
if [ $? -eq 0 ]; then
ls -asl # ์์ ๋ถ๊ธฐ๋ฌธ์ ๊ฑธ๋ฌ์ ธ์ ์ด ๋ช
๋ น์ ์คํ์ด ์๋จ
fi
shell command ์คํ
$() : command substitution ์ด๋ผ๊ณ ํ๋ค. ๊ดํธ ์์ ์ฐ์ฌ์ง ๋ฌธ์๋ฅผ ๋ช ๋ น์ด๋ก ์ธ์ํ์ฌ ์คํํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํด์ค๋ค. ์ฆ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ , output์ $() ์์ ๋ฃ์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ expert ํ ๋ ๋ฐฐ์ ๋ ๋ฐฑํฑ(์ญ๋ฐ์ดํ)๋, expert๋ฟ๋ง ์๋๋ผ ๋ช ๋ น๋ฌธ์ ๊ทธ๋๋ก ์จ์ฃผ๋ฉด $()์ ๊ฐ์ด ์ ๋ช ๋ น์ด๋ก ์ธ์ํด์ ๋ช ๋ น์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด ์ค๋ค.
#!/bin/bash
# ๊ทธ๋ฅ date ๋ฌธ์์ด ์ถ๋ ฅ
echo date
# ๋ฐฑํฑ์ผ๋ก ๊ฐ์ธ์ฃผ๋ฉด date ๋ช
๋ น์ด๊ฐ ์คํ๋๊ฒ ๋๋ค.
echo `date`
# $()๋ ๋ง์ฐฌ๊ฐ์ง
echo $(date)
# shell execution
echo "I'm in `pwd`"
echo "I'm in $(pwd)"
$ bash test.sh
date
2021๋
4์ 10์ผ ํ ์์ผ 04์ 10๋ถ 28์ด KST
2021๋
4์ 10์ผ ํ ์์ผ 04์ 10๋ถ 28์ด KST
I'm in /src/shell
I'm in /src/shell
๋ฌธ์์ด ํจํด ๋น๊ต
ํจํด ๋น๊ต๋ ์ผ์ข ์ ๋ฌธ์์ด์ ์ฐ์ฐํ๋ ๊ฒ์ผ๋ก ํน์ ํ pattern์ ๋๊ณ ๋ณ์์ ๋ฌธ์์ด ๊ฐ์ด ์ผ๋ถ๋ถ์ด๋ผ๋ ์ด ํจํด๊ณผ ์ผ์นํ๋์ง ๊ฒ์ฌํ ๋ ์ฐ์ธ๋ค.
์ด ํจํด์๋ ์์ผ๋์นด๋ ๋ฌธ์ ( *, ?, [ ] ๋ฅผ ํฌํจํ ๋ฌธ์ ์ธํธ)๋ฅผ ํฌํจํด๋ ๋๋ค.
${#var} | ๋ณ์ var๊ฐ ๊ฐ์ง๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค. | |||
${var:-word} | 1. ๋ณ์ var์ ๊ฐ์ด null์ด ์๋๋ฉด : var์ ๊ฐ์ ๋ฐํ, var์ ๊ฐ์ ๋ณํ์ง ์๋๋ค. 2. ๋ณ์ var์ ๊ฐ์ด null์ด๋ฉด : word์ ๊ฐ์ ๋ฐํ, var์ ๊ฐ์ ๋ณํ์ง ์๋๋ค. |
|||
${var:=word} | 1. ๋ณ์ var์ ๊ฐ์ด null์ด ์๋๋ฉด : var์ ๊ฐ์ ๋ฐํ, var์ ๊ฐ์ ๋ณํ์ง ์๋๋ค. 2. ๋ณ์ var์ ๊ฐ์ด null์ด๋ฉด : word์ ๊ฐ์ ๋ฐํ, var์ ๊ฐ์ word์ ๊ฐ์ผ๋ก ๋์ฒด๋๋ค. |
|||
${var:+word} | 1. ๋ณ์ var์ ๊ฐ์ด null์ด ์๋๋ฉด : word์ ๊ฐ์ ๋ฐํ, var์ ๊ฐ์ ๋ณํ์ง ์๋๋ค. 2. ๋ณ์ var์ ๊ฐ์ด null์ด๋ฉด : null์ ๋ฐํ, var์ ๊ฐ์ ๋ณํ์ง ์๋๋ค. |
|||
${var:?word} | 1. ๋ณ์ var์ ๊ฐ์ด null์ด ์๋๋ฉด : var์ ๊ฐ์ ๋ฐํ, var์ ๊ฐ์ ๋ณํ์ง ์๋๋ค. 2. ๋ณ์ var์ ๊ฐ์ด null์ด๋ฉด : null์ด๋ฉด ์๋ฌ ๋ฉ์์ง์ธ word๋ฅผ ์ถ๋ ฅํ๊ณ , ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ข ๋ฃํ๋ค. 2๋ฒ ์งธ ๊ฒฝ์ฐ์ด๊ณ word๊ฐ ์๋ต๋์๋ค๋ฉด "parameter null or not set" ๋ผ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ข ๋ฃํ๋ค. |
${var%pattern} | ๋์์ ๋ถํฐ word์ ํจํด์ด ์ผ์นํ๋ var์ ์ต์ ๋ถ๋ถ(์ฒซ๋ฒ์งธ ์ผ์น)์ ์ ๊ฑฐํ๊ณ ๋๋จธ์ง๋ฅผ ๋ฐํํ๋ค. | |||
${var%%pattern} | ๋์์ ๋ถํฐ word์ ํจํด์ด ์ผ์นํ๋ var์ ์ต๋ ๋ถ๋ถ(๋ง์ง๋ง ์ผ์น)์ ์ ๊ฑฐํ๊ณ ๋๋จธ์ง๋ฅผ ๋ฐํํ๋ค. | |||
${var#pattern} | ์ฒ์ ๋ถํฐ word์ ํจํด์ด ์ผ์นํ๋ var์ ์ต์ ๋ถ๋ถ(์ฒซ ๋ฒ์งธ ์ผ์น)์ ์ ๊ฑฐํ๊ณ ๋๋จธ์ง ๋ถ๋ถ์ ๋ฐํํ๋ค. | |||
${var##pattern} | ์ฒ์ ๋ถํฐ word์ ํจํด์ด ์ผ์นํ๋ var์ ์ต๋ ๋ถ๋ถ(๋ง์ง๋ง ์ผ |
#!/bin/bash
# var not exists
unset var1
echo ${var1:-string2}
# var exists
var1=string1
echo ${var1:-string2}
var1=/var/log/apt
echo ${var1#*/}
echo ${var1##*/}
var2=/var/log/apt/log/ifconfig.cfg
echo ${var2%log*}
echo ${var2%%log*}
$ ./script.sh
string2
string1
var/log/apt
apt
/var/log/apt/
/var/
BASH ์ ์คํฌ๋ฆฝํธ ์ฐ์ต๋ฌธ์ ์ฝ๋
๊ตฌ๊ตฌ๋จ ์ถ๋ ฅ
#!/usr/bin/bash
for i in {2..9}; do # 2์์ 9๊น์ง ๋ ์ธ์ง ๋ฆฌ์คํธ๋ฅผ ์ํ
for j in {1..9}; do # 1์์ 9๊น์ง ๋ ์ธ์ง ๋ฆฌ์คํธ๋ฅผ ์ํ
echo "$i * $j = $((i*j))" # $(( )) ๋ ๊ดํธ์์ ๋ฌธ์๋ฅผ ์ฐ์ ์ฒ๋ฆฌ ํด์ค๋ค.
done
done

ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ txtํ์ผ๋ค ์คํ๊ถํ ๋ค ์ฃผ๊ธฐ
ํฐ๋ฏธ๋์์ ์ผ์ผํ ํด๋ ๋์ง๋ง, ์คํฌ๋ฆฝํธ๋ก ํ๋ฐฉ์ ํด๋ณด์.
#!/sur/bin/bash
for file in `ls *.txt` # ์ญ๋ฐ์ดํ``๋ก ๋ฌถ์ด ls๋ฅผ ๋ฌธ์๊ฐ ์๋ ์๋ช
๋ น์ด๋ก ์ธ์ํ์ฌ, txtํ์ผ ๋ชฉ๋ก๋ค์ ์ป์ด ์ํ
do
chmod +x $file # ๊ฐ ํ์ผ๋ง๋ค ์คํ๊ถํ ์ถ๊ฐ
echo "${file}์คํ๊ถํ ์ถ๊ฐ ์๋ฃ"
done
์ธ์๋ก ๋ฐ์ ํ์ผ ๋๋ ํ ๋ฆฌ์ ํ์ผ ์ด๋ฆ ์ถ๋ ฅ
ํฐ๋ฏธ๋์์ ์ธ์๋ฅผ ๋ฐ์ผ๋ฉด ์ธ์์ ๋ง๋ ๋๋ ํ ๋ฆฌ์ ํ์ผ๋ช ์ ์ถ๋ ฅ
#!/bin/bash
# $()๋ ๋ฐฑํฑ๊ณผ ๊ฐ์ด ์์ ์ธ์๋ฅผ ๋ช
๋ น์ด ์คํ ์ฒ๋ฆฌ
# ํฐ๋ฏธ๋์์ ๋ฐ์ ์ธ์ $0์ dirnameํ์ฌ ๋๋ ํ ๋ฆฌ๋ช
์ ์ป๊ณ cd ์ด๋ํ๊ณ pwd๋ก ์ ๋๊ฒฝ๋ก๊ฐ์ ๋ณ์์ ์ ์ฅ
scriptFolder=$(cd $(dirname "$0") && pwd)
# ์ ๋๊ฒฝ๋ก๊ฐ์ ์ธ์๋ก ํ์ฌ basename ํ์ผ๋ช
์ ๋ณ์์ ์ ์ฅ
scriptName=$(basename $scriptFolder)
echo "scriptFolder: $scriptFolder"
echo "scriptName: $scriptName"
$ bash test.sh
scriptFolder: /Users/src/shell
scriptName: test.sh
๋ง์ง๋ง ์์ ์ ์ข ๋ฃ ์ํ ํ์ธ
rm ๋ช ๋ น์ด์ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋์์ ์ข ๋ฃ์ฝ๋ ๋ณ์ $? ์ ๋ถ๊ธฐ๋ฌธ์ ํตํด ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
์ ๋ง ๋ง์ด ์ฌ์ฉํ๋ ํจํด์ด๋ ๊ผญ ์ตํ์.
์์์ ๋ช ๋ น์ด ์ข ๋ฃ ์ํ ์ฝ๋ ์น์ ์์ ํด๋น ์๋ฆฌ์ ๋ํด ์ค๋ช ํ๋ค. ๋ชจ๋ฅด๋ฉด ๋ค์ ์ฌ๋ ค๋ณด์.
#!/bin/bash
# ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ณ์์ ์ ์ฅ
fileToRemove="/tmp/some-file"
# ํ์ผ ์ญ์ ์๋. ๋ง์ผ ์ค๋ฅ๊ฐ ๋๋ฉด ์ค๋ฅ ์ฌ์ง์ ์ผ๋ก ๋ณด๋ด์ ์ค๋ฅ ์ถ๋ ฅ๋์ง ์๊ฒ ์ฒ๋ฆฌ
rm "$fileToRemove" 2> /dev/null
# ํ์ผ ์ญ์ ์ฑ๊ณต(0) ์คํจ(1) ์ฌ๋ถ๋ฅผ ๋ฐ์ ธ ๋ถ๊ธฐ๋ฌธ ์ฒ๋ฆฌ
if [ $? -eq 0 ]; then
echo "Success removing file: $fileToRemove"
else
echo "File does not exist: $fileToRemove"
fi
# ๋ง์ผ /tmp/some-file ์ด๋ผ๋ ๊ฒฝ๋ก ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ
$ bash test.sh
File does not exist: /tmp/some-file
ํ๋ก๊ทธ๋จ์ ์คํ์๊ฐ ์ธก์
์๋์ ํ๋ก๊ทธ๋จ์ ์ธ์๋ก ์ฃผ์ด์ง ๋ช ๋ น์ ์คํํ๊ณ ๊ฑธ๋ฆฐ์๊ฐ์ ๋๋ ธ์ด ๋จ์๋ก ์ธก์ ํ๋ค.
#!/bin/bash
# ๋ง์ผ ์ฌ์ฉ์๊ฐ ์ธ์๋ฅผ ์ฃผ์ง ์์์ ๊ฒฝ์ฐ.. ($#๋ ์ธ์์ ๋ชจ๋ ๊ฐฏ์)
if [ $# -eq 0 ]; then
echo "Input the filename, please..."
exit 0 # ์คํฌ๋ฆฝํธ ์ข
๋ฃ
fit
Command=$1 # ์ธ์๋ฅผ ๋ณ์์ ์ ์ฅ
echo $Command
time1=`date +%s.%N` # ํ์ฌ ์๊ฐ ๊ตฌํจ.
$1 # ์ธ์๋ฅผ ๋ช
๋ น์ด๋ก์ ์คํ
time2=`date +%s.%N` # %s : ํ์์คํฌํ ๊ตฌํ๊ธฐ. %N : ๋๋
ธ์ด๋ก ํฌ๋งท
diff=`echo "$time2 - $time1" | bc` # ์ค์ ์ฐ์ฐ์ ํ๋ ค๋ฉด bc ๋ช
๋ น์ด๋ฅผ ํ์ฉํ๋ค
echo "======================================="
echo "๊ฑธ๋ฆฐ์๊ฐ : $diff"

๋ก๊ทธ ํ์ผ ์ ๋ฆฌํ๊ธฐ
๋ก๊ทธ ํ์ผ ์ค์ 2์ผ ์ด์ ์ง๋ ํ์ผ๋ค์ ์์ถ์ ํด์ ๋ณด๊ดํด๋ผ
์์ถ๋ ๋ก๊ทธ ํ์ผ ์ค์ 3์ผ ์ด์ ๊ฒฝ๊ณผํ ๊ฒ๋ค์ ์ญ์ ํด๋ผ
#!/bin/bash
LOGDIR=/var/log # ๋๋ ํ ๋ฆฌ ๋ณ์ ์ ์ธ
GZIPDAY=1
DELDAY=2
cd $LOGDIR # ๋ก๊ทธ๊ฐ ์ ์ฅ๋์ด์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
echo "cd $LOGDIR"
# ์ผ๋ฐํ์ผ ํ์
์ด๊ณ ํ์ผ๋ช
์ด log, log.1 ... ๋ก ๋๋๊ณ -mtime +1(์์ ๋์ง 2์ผ ์ง๋) ํ์ผ๋ค ๊ฒ์ํ์ฌ gzip ์์ถํ๋ค.
# 2> ๋จ ์ค๊ฐ์ ์ค๋ฅ๋๋ ์ฝ๋๊ฐ ์ฃฝ์ง์๊ณ ์ค๋ฅ ๋ฆฌ๋ค์ด๋ ์
์ ํตํด ๋๊ธฐ๊ณ ์งํ (try.. catch ๊ฐ๋
)
sudo find . -type f -name '*log.?' -mtime +$GZIPDAY -exec bash -c "gzip {}" \; 2>
# ์ผ๋ฐํ์ผ ํ์
์ด๊ณ ํ์ผํ์ฅ์๊ฐ .gz์ด๊ณ , -mtime +2(์์ ๋์ง 3์ผ ์ง๋) ํ์ผ๋ค ๊ฒ์ํ์ฌ ์ญ์ ํ๋ค.
sudo find . -type f -name '*.gz' -mtime +$DELDAY -exec bash -c "rm -f {}" \; 2>
cd ๋ช ๋ น์ ์ข ๋ฃ ์ํ ๊ฐ์ ํ์ธํด์ผ ํ๋ค
์๋์ ๊ฐ์ด ์๋ ๋๋ ํฐ๋ฆฌ์ ์ ๊ทผํ๋ ค๋ค๊ฐ ์คํจํ ๊ฒฝ์ฐ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ ๋ชจ๋ ํ์ผ๋ค์ ๋ ๋ ค๋ฒ๋ฆด ์ ์๋ค.
#!/bin/bash
cd ~/tempdir # ๋๋ ํ ๋ฆฌ ์ด๋
rm -rf *
# ์๋๋๋ก๋ผ๋ฉด tempdir์ ์๋ ๋ชจ๋ ํ์ผ์ ์ง์ฐ๋ ๊ฒ์ด๊ฒ ์ง๋ง,
# ๋ง์ผ cd๊ฐ ์คํจํ์ ๊ฒฝ์ฐ ์๋ฑํ ๋๋ ํ ๋ฆฌ ํ์ผ์ ๋ค ๋ ๋ฆด ์ ์๋ค.
๋ฐ๋ผ์ ๋ฐ๋์ cd ๋ช ๋ น์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ์ฒดํฌํด์ผ ํ๋ค.
#!/bin/bash
# and ์ฐ์ฐ์๋ฅผ ์จ์ ์์ ๋ช
๋ น์ด๊ฐ ์ฑ๊ณตํด์ผ ๋ค์ ๋ช
๋ น์ด๊ฐ ์คํ๋๋๋ก
cd ~/tempdir && rm -rf *
# ์์ ๋ช
๋ น์ด๊ฐ ์คํจํ๋ฉด, ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํด์ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๊ณ exit 1 ์ข
๋ฃํ๋ค.
# >&2๋ ๋ชจ๋ ์ถ๋ ฅ์ ๊ฐ์ ๋ก ์ ์คํฌ๋ฆฝํธ์ ํ์ค ์๋ฌ๋ก ์ถ๋ ฅํ๋ค.
cd ~/tempdir || { echo >&2 "cd ~/tempdir failed"; exit 1 ;}
์๋ ๋ฐฑ์ ํ๊ธฐ
#!/bin/bash
# -z๋ null ๊ฒ์ฌ
if [ -z $1 ] || [ -z $2 ]; then
echo usage : $0 sourcedir targetidir # ๋ง์ผ ํฐ๋ฏธ๋์์ ์ธ์ 2๊ฐ๋ฅผ ์์จ์คฌ์ ๊ฒฝ์ฐ ์ฌ์ฉ ์ค๋ช
์ ์ถ๋ ฅ
else
SRCDIR=$1 # ์ธ์๋ฅผ ๋ณ์์ ๋ฃ์
DSTDIR=$2
BACKUPFILE=backup.$(date +%y%m%d%H%M%S).tar.gz # ํ์ผ๋ช
ํ์์ backup.๋ ์ง.tar.gz ๋ก ์ค์
if [ -d $DSTDIR ]; then # ๋ง์ผ ํด๋น ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ๋ฉด
tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR # ํด๋น ๋๋ ํ ๋ฆฌ์ ํ์ผ ์์ถ ์คํ
else # ์กด์ฌํ์ง ์๋๋ค๋ฉด
mkdir $DSTDIR # ๋๋ ํ ๋ฆฌ ๋ง๋ค๊ณ
tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR # ํด๋น ๋๋ ํ ๋ฆฌ์ ํ์ผ ์์ถ ์คํ
fi
fi
< ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ backupdir/ ๋๋ ํ ๋ฆฌ์ logfile ํ์ผ์ ์์นด์ด๋น ์์ถํด์ ๋ณด๊ด >
< ํ์ผ๋ช
ํ์์ backup.ํ์ฌ๋ ์ง.tar.gz >
$ bash script.sh logfile backupdir
์ ์คํฌ๋ฆฝํธ ๋์ ์์ฑ (๋๋ค ์ซ์)
#!/bin/bash
# 0๋ถํฐ 9๊น์ง์ ๋๋ค ์ซ์ ์์ฑ
random_num="$(($RANDOM % 10))"
echo $random_num
# 1๋ถํฐ 10๊น์ง์ ๋๋ค ์ซ์ ์์ฑ
random_num="$(($RANDOM % 10+1))"
echo $random_num
# 100๋ถํฐ 110๊น์ง์ ๋๋ค ์ซ์ ์์ฑ
random_num="$(($RANDOM % 11+100))"
echo $random_num
# 200๋ถํฐ 300๊น์ง์ ๋๋ค ์ซ์ ์์ฑ
random_num="$(($RANDOM % 101+200))"
echo $random_num
๋ฐ์ดํฐ๋ฅผ ์์๋ด์ ๋ฐฑ์ ํ๊ธฐ
ls -al ์ ๊ฒฐ๊ณผ์์ 'ํฉ๊ณ' ์ ์๋๊ฒฝ๋ก ., .. ์ ์ ์ธํ๊ณ ๋๋จธ์ง๋ฅผ ํ์ผ๋ช ๊ณผ ํ์ผ์ฌ์ด์ฆ๋ง ์ถ๋ ฅํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ์ ์ ์ฅ

#!/bin/bash
PRE_IFS=$IFS # IFS ๋ฐฑ์
IFS="
" # IFS๋ฅผ ๊ฐํ์ผ๋ก ๋ณํ
TOT=0 # ํ์ผ์ฉ๋ ํฉ๊ณ ๋ณ์
cd /home/inpa # ์ ํด์ง ์์น์์
FileName="result.txt"
touch $FileName # ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋น ํ์ผ ์์ฑ
echo "---------------------------------------------"
for i in `ls -al /`; do # ls ํ ๊ฒฐ๊ณผ ๋ด์ฉ๋ฅผ ๋ฃจํ
S=`echo $i | awk '{print $5}'` # ํ ํ(๋ ์ฝ๋)์ 5๋ฒ์งธ ํ๋(ํ์ผ์ฌ์ด์ฆ) ์ ์ฅ
F=`echo $i | awk '{print $9}'` # ํ ํ(๋ ์ฝ๋)์ 9๋ฒ์งธ ํ๋(ํ์ผ๋ช
) ์ ์ฅ
# ๋ง์ผ ์๋๊ฒฝ๋ก๋ ๋น์นธ์ด๋ฉด continue
if [[ ${F} == "." || ${F} == ".." || ${F} == "" ]]; then
continue
fi
#TOT=$(( ${TOT} += ${S} )) ์ด ์์์ ์คํ๋์ง ์๋๋ค. ์๋ํ๋ฉด awkํ ๊ฒฐ๊ณผ๋ ๋ฌธ์์ด๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ $(()) ์ฐ์ ์ฐ์ฐ์ด ์๋๊ธฐ ๋๋ฌธ
TOT=`expr $TOT + $S` # expr๋ ์์ํ๋ก์ธ์ค๋ก ํฐ๋ฏธ๋์์ ์คํํ ๊ฒฐ๊ณผ์ด๊ธฐ ๋๋ฌธ์ ์๊ด์์
echo "$S $F" >> $FileName # ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ๋ฆฌ๋ค์ด๋ ์
์ด์ด์ฐ๊ธฐ
done
echo $TOT # ํ์ผ์ฌ์ด์ฆ ํฉ๊ณ ์ถ๋ ฅ
IFS=$PRE_IFS # IFS ๋กค๋ฐฑ
# ์ฐธ๊ณ ์๋ฃ
https://blog.gaerae.com/2015/01/bash-hello-world.html
https://jhnyang.tistory.com/175
https://jhnyang.tistory.com/153
https://se.uzoogom.com/140
https://118k.tistory.com/324
https://probe29.tistory.com/47
https://velog.io/@pingping95/Bash-Shell-Script-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90
https://reakwon.tistory.com/136
https://shlee1990.tistory.com/917
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.