๋ชฉ์ฐจ
Shell Script
.sh ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ก, ๋ด๋ถ์ ์
ธ์ด ์ํํ ์ ์๋ ๋ช
๋ น๊ณผ ๊ธฐ๋ฅ์ ์ ์ํ๋ ์คํฌ๋ฆฝํธ
โข
์คํฌ๋ฆฝํธ ํ์ผ ์ฒซ ์ค์ ์
๋ฑ
(Shebang) #!/bin/bash๋ฅผ ์ ์ธํ์ฌ ์คํฌ๋ฆฝํธ๊ฐ bash ์
ธ์์ ์คํ๋จ์ ๋ช
์
โข
์
ธ ์คํ
โฆ
bash bash.sh
โช
์๋ธ์
ธ์์ ์คํ
โช
๋ณ์๋ ํจ์๋ ์๋ธ์
ธ์์๋ง ์ ํจ
โฆ
. bash.sh
โช
ํ์ฌ ์
ธ์์ ์คํ
โช
๋ณ์๋ ํจ์๊ฐ ํ์ฌ ์
ธ์ ๋จ์ ์์
โฆ
./bash.sh
โช
์คํ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ ์๋ธ์
ธ์์ ์คํ
โช
์คํฌ๋ฆฝํธ์ ์ฒซ ๋ฒ์งธ ์ค์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ์
ธ๋ก ์คํ
๋ณ์ ์ฌ์ฉ
#!/bin/bash
name=var
echo $name
read data # ์
๋ ฅ์ ๋ฐ์
echo $data
Shell
๋ณต์ฌ
๋ช ๋ น ์คํ
โข
๋ช
๋ น์ด ๋์ฒด: ๋ฐฑํฑ`` ๋๋ ๋ฌ๋ฌ ์ฌ์ธ $() ์ ์ฌ์ฉํ์ฌ ๋ช
๋ น์ด์ ์ถ๋ ฅ์ ๋ณ์์ ์ ์ฅํ๊ฑฐ๋ ์ถ๋ ฅ
#!/bin/bash
data="data"
echo `data` # ๋๋ echo $date
Shell
๋ณต์ฌ
ํ๋ผ๋ฏธํฐ ์ ๋ฌ
โข
์คํฌ๋ฆฝํธ ๋ด๋ถ๋ก ํ๋ผ๋ฏธํฐ ์ ๋ฌ
โข
ํ๋ผ๋ฏธํฐ
โฆ
$0: ์คํฌ๋ฆฝํธ ์ด๋ฆ
โฆ
$1 ~ $n: ์ ๋ฌ๋ ๊ฐ ํ๋ผ๋ฏธํฐ
โฆ
$@: ๋ชจ๋ ํ๋ผ๋ฏธํฐ
โฆ
$#: ํ๋ผ๋ฏธํฐ์ ๊ฐ์
#!/bin/bash
echo "file name : $0"
echo "1. param $1"
echo "2. param $2"
echo "all param $@"
echo "params count $#"
## ์คํ์ bash pram.sh arg1 arg2 ๋ก ์ฌ์ฉํจ. ์ ๋ฌ ํ๋ผ๋ฏธํฐ๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๋ง์๋ ์คํ๋จ
Shell
๋ณต์ฌ
์ฐ์ ์ฐ์ฐ
โข
์ด์ค ๊ดํธ (( ))๋ฅผ ์ฌ์ฉํด ์ฐ์ ์ฐ์ฐ ์ํ
โข
expr ํค์๋ + ๋ฐฑํฑ ``์ ํตํด ์ฐ์ ์ฐ์ฐ ์ํ
โฆ
๊ณฑ์
์ ์ํํ ๋๋ \ ๊ธฐํธ ์ฌ์ฉ \*
#!/bin/bash
num1=10
num2=20
echo "result = $(($num1 + $num2))"
echo "result = `expr $num1 + $num2`"
Shell
๋ณต์ฌ
์กฐ๊ฑด๋ฌธ
#!/bin/bash
# ๋จ์ผ
if [ ์กฐ๊ฑด ] ๋๋ test ์กฐ๊ฑด; then
์ฐธ์ธ ๊ฒฝ์ฐ ์คํ
fi
#๋ค์ค
if [ ์กฐ๊ฑด ] ๋๋ test ์กฐ๊ฑด; then
์ฐธ์ธ ๊ฒฝ์ฐ ์คํ
elif [ ์กฐ๊ฑด ] ๋๋ test ์กฐ๊ฑด; then
์ฐธ์ธ ๊ฒฝ์ฐ ์คํ
else
์กฐ๊ฑด์ด ๋ชจ๋ ๊ฑฐ์ง์ธ ๊ฒฝ์ฐ ์คํ
fi
Shell
๋ณต์ฌ
โข
์กฐ๊ฑด
๋ฌธ์์ด ๋น๊ต | ์๋ฏธ |
= | ๋ ๋ฌธ์์ด์ด ๊ฐ์ผ๋ฉด ์ฐธ |
!= | ๋ ๋ฌธ์์ด์ด ๋ค๋ฅด๋ฉด ์ฐธ |
-n โ๋ฌธ์์ดโ | ๋ฌธ์์ด์ด NULL(๋น ๋ฌธ์์ด)์ด ์๋๋ฉด ์ฐธ |
-z โ๋ฌธ์์ดโ | ๋ฌธ์์ด์ด NULL(๋น ๋ฌธ์์ด)์ด๋ฉด ์ฐธ |
์ฐ์ ๋น๊ต | ์๋ฏธ |
์์1 -eq ์์2 | ๋ ์์์ด ๊ฐ์ผ๋ฉด ์ฐธ |
์์1 -ne ์์2 | ๋ ์์์ด ๋ค๋ฅด๋ฉด ์ฐธ |
์์1 -gt ์์2 | ์์1์ด ํฌ๋ฉด ์ฐธ |
์์1 -ge ์์2 | ์์1์ด ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ฐธ |
์์1 -lt ์์2 | ์์ 1์ด ์ ์ผ๋ฉด ์ฐธ |
์์1 -le ์์2 | ์์1์ด ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ฐธ |
!์์ | ์์์ด ๊ฑฐ์ง์ด๋ฉด ์ฐธ |
ํ์ผ ๊ด๋ จ | ์๋ฏธ |
-d ํ์ผ๋ช
| ํ์ผ์ด ๋๋ ํฐ๋ฆฌ๋ฉด ์ฐธ |
-e ํ์ผ๋ช
| ํ์ผ์ด ์กด์ฌํ๋ฉด ์ฐธ |
-f ํ์ผ๋ช
| ํ์ผ์ด ์ผ๋ฐ ํ์ผ์ด๋ฉด ์ฐธ |
-r ํ์ผ๋ช
| ํ์ผ์ด ์ฝ๊ธฐ ๊ฐ๋ฅํ๋ฉด ์ฐธ |
-w ํ์ผ๋ช
| ํ์ผ์ด ์ฐ๊ธฐ ๊ฐ๋ฅํ๋ฉด ์ฐธ |
-x ํ์ผ๋ช
| ํ์ผ์ด ์คํ ๊ฐ๋ฅํ๋ฉด ์ฐธ |
๋ฐ๋ณต๋ฌธ
for loop
for ๋ณ์ in [์กฐ๊ฑด]
do
# ๋ฐ๋ณตํ ๋ช
๋ น
done
Shell
๋ณต์ฌ
โข
์กฐ๊ฑด
โฆ
1 2 3 4 5 : ์
๋ ฅํ ์์๋๋ก for๋ฌธ์ ๋ณ์๋ก ์คํ
โฆ
{1..10} : 1๋ถํฐ 10๊น์ง ๋ฐ๋ณต
โฆ
$(seq 1 10) : 1๋ถํฐ 10๊น์ง ๋ฐ๋ณต
while loop
while [์กฐ๊ฑด]
do
# ๋ฐ๋ณตํ ๋ช
๋ น
done
Shell
๋ณต์ฌ
โข
์์ (1~10 ์ถ๋ ฅ)
#!/bin/bash
for i in $(seq 1 10)
do
echo "ํ์ฌ ์ซ์: $i"
done
count=1
while [ $count -le 10 ]
do
echo "ํ์ฌ ์นด์ดํธ: $count"
((count++)) # ์นด์ดํธ๋ฅผ 1 ์ฆ๊ฐ
done
Shell
๋ณต์ฌ
์ ์ด
โข
break
โข
continue
๋ฐฐ์ด
# ์ ์ธ
arr=("val1" "val2" ... "valn")
# ํ ๋น, ์ถ๊ฐ ๋ฐ ์ญ์
arr[n]="valn"
arr+=("valn") # ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์ถ๊ฐ
unset arr[n] # n๋ฒ์งธ ์์ ์ญ์
# ์ถ๋ ฅ
echo ${arr[@]} # ๋ชจ๋ ์์ ์ถ๋ ฅ
echo ${arr[*]} # ๋ชจ๋ ์์ ์ถ๋ ฅ
echo ${arr[n]} # n๋ฒ์จฐ ์์ ์ถ๋ ฅ
# ๋ฐฐ์ด ๊ธธ์ด ์ถ๋ ฅ
echo ${#arr[@]}
Shell
๋ณต์ฌ
ํจ์
โข
์ ์ญ๋ณ์ (Global Variable)
โฆ
์คํฌ๋ฆฝํธ ์ ์ฒด์์ ์ฌ์ฉ ๊ฐ๋ฅ
โฆ
ํจ์ ์ธ๋ถ์ ์ ์
โข
์ง์ญ๋ณ์ (Local Variable)
โฆ
ํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
โฆ
ํจ์ ๋ด๋ถ์ ์ ์
โข
ํจ์ ์ ์ธ ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ ์ธํ์ง ์์ (function func(param1, param2)์ ํํ๋ฅผ ๊ฐ์ง ์์)
#!/bin/bash
# ์ ์ญ ๋ณ์
global_var="I am a global variable"
function my_function() {
# ๋ก์ปฌ ๋ณ์
local local_var="I am a local variable"
echo "$global_var"
echo "$local_var"
}
my_function
# ๋ก์ปฌ ๋ณ์๋ ํจ์ ์ธ๋ถ์์ ์ ๊ทผ ๋ถ๊ฐ
echo "$local_var" # ์ถ๋ ฅ๋์ง ์์
Shell
๋ณต์ฌ
#!/bin/bash
greet() {
local name=$1 # ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ name ๋ณ์์ ํ ๋น
echo "์๋
ํ์ธ์, $name!" # ์ธ์ฌ ๋ฉ์์ง ์ถ๋ ฅ
}
# ํจ์ ํธ์ถ
greet "ํ๊ธธ๋" # "ํ๊ธธ๋"์ด๋ผ๋ ์ธ์(argument)๋ฅผ ์ ๋ฌ
# ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ ํจ์
add_numbers() {
local sum=0 # ํฉ๊ณ๋ฅผ ์ ์ฅํ ๋ณ์ ์ด๊ธฐํ
for number in "$@"; do # ๋ชจ๋ ํ๋ผ๋ฏธํฐ์ ๋ํด ๋ฐ๋ณต
sum=$((sum + number)) # ๊ฐ ์ซ์๋ฅผ ๋ํจ
done
echo "ํฉ๊ณ: $sum" # ์ต์ข
ํฉ๊ณ ์ถ๋ ฅ
}
# ํจ์ ํธ์ถ
add_numbers 1 2 3 4 5 # ์ฌ๋ฌ ์ซ์๋ฅผ ์ ๋ฌ
Shell
๋ณต์ฌ
๋์ ๋๋ฆฌ
# ์ ์ธ
declare -A ๋์
๋๋ฆฌ๋ช
# ํ ๋น
dict['key'] = value
# ๊ฐ ์กฐํ
${#dict[@]} # ๋์
๋๋ฆฌ ์์ ๊ฐ์
${dict['key']} # ๋์
๋๋ฆฌ keyํด๋น ๊ฐ
${!dict[@]} # ๋์
๋๋ฆฌ keys
${dict[@]} # ๋์
๋๋ฆฌ values
Shell
๋ณต์ฌ
โข
์์
#!/bin/bash
# ๋์
๋๋ฆฌ ์ ์ธ
declare -A colors
# ๊ฐ ํ ๋น
colors['red']="๋นจ๊ฐ"
colors['green']="์ด๋ก"
colors['blue']="ํ๋"
# ๋์
๋๋ฆฌ์ ์์ ๊ฐ์ ์ถ๋ ฅ
echo "๋์
๋๋ฆฌ ์์ ๊ฐ์: ${#colors[@]}"
# ๋ชจ๋ ํค์ ๊ฐ ์ถ๋ ฅ
echo "๋ชจ๋ ํค์ ๊ฐ:"
for key in "${!colors[@]}"; do
echo "$key: ${colors[$key]}"
done
# ํน์ ํค์ ๊ฐ ์ถ๋ ฅ
echo "red์ ๊ฐ: ${colors['red']}"
Shell
๋ณต์ฌ
awk
โข
ํ
์คํธ ํ์ผ์ ๊ตฌ์กฐํ ๋ฐ ์ฒ๋ฆฌ
โข
๋ฐ์ดํฐ ํ๋๋ฅผ ๊ตฌ๋ถํ๊ณ ํจํด์ ๋ง๊ฒ ์์
์ํ ๊ฐ๋ฅ
awk [options] '[pattern] {action}' filename
# ์ต์
-F fs ํ๋ ๊ตฌ๋ถ์ ์ง์
-v var=value ๋ณ์ var๋ฅผ ๊ฐ value๋ก ์ด๊ธฐํ
# ํจํด
~ ์ผ์น
!~ ์ผ์น ํ์ง ์๋
BEGIN ์ฒซ๋ฒ์งธ ๋ ์ฝ๋ ์ฒ๋ฆฌ ์
BEGIN ์ฒซ๋ฒ์งธ ๋ ์ฝ๋ ์ฒ๋ฆฌ ํ
Shell
๋ณต์ฌ
โข
๋ด์ฅ ๋ณ์
FILENAME | ์
๋ ฅ ํ์ผ ์ด๋ฆ |
$0 | ์
๋ ฅ ๋ ์ฝ๋ |
$n | n๋ฒ์งธ ํ๋ |
NR | ๋ผ์ธ ์ (์๋์ผ๋ก 1์ฉ ์ฆ๊ฐ) |
NF | ํ๋ ์ |
FS | ํ๋ ๊ตฌ๋ถ์ (๊ธฐ๋ณธ๊ฐ = ๊ณต๋ฐฑ) |
RS | ๋ ์ฝ๋ ๊ตฌ๋ถ์ (๊ธฐ๋ณธ๊ฐ = \n) |
โข
๋ด์ฅ ํจ์
length(string) | ๋ฌธ์์ด ๊ธธ์ด ๋ฐํ |
substr(string, start, [length]) | ๋ฌธ์์ด string์ start๋ถํฐ length๋งํผ ์ถ์ถ |
index(string, search) | string์ search ๋ฌธ์์ด ์์์์น ๋ฐํ |
sub(r, s, [t]) | ์ผ์นํ๋ ์ฒซ ๋ฌธ์์ด r์ ๋ฌธ์์ด s๋ก ๋์ฒด |
gsub(r, s, [t]) | ๋ฌธ์์ด r๊ณผ ์ผ์นํ๋ ๋ชจ๋ ๋ถ๋ถ s๋ก ๋์ฒด |
int(x) | x์ ์ ์ ๋ถ๋ถ ๋ฐํ |
rand() | 0๊ณผ 1 ์ฌ์ด์ ๋์ ๋ฐํ |
โข
์์
1 coke 1200 DRINK
2 dr.pepper 950 DRINK
3 fanta 1000 DRINK
4 apple 1500 FRUIT
Shell
๋ณต์ฌ
# ์ํ๋ช
๊ธ์์ ์ถ๋ ฅ
awk '{ print $2, length($2) }' products
# APPLE -> BANANA ๋ณ๊ฒฝ
awk '{ gsub(/apple/, "banana", $0); print }' products
# ์ํ๋ช
, ์นดํ
๊ณ ๋ฆฌ๋ง ์ถ๋ ฅ
awk '{ print $2, $4 }' products
# ์ํ ์ด ํฉ๊ณ ๊ธ์ก ์ถ๋ ฅ
awk '{ sum += $3 } END { print "์ด ๊ธ์ก:", sum }' products
# ์ํ ํ๊ท ๊ธ์ก ์ถ๋ ฅ
awk '{ sum += $3; count++ } END { print "ํ๊ท ๊ธ์ก:", sum/count }' products
Shell
๋ณต์ฌ
sed
โข
๋น๋ํํ ์คํธ๋ฆฌ๋ฐ ํธ์ง๊ธฐ (Stream Editor)
โข
ํ
์คํธ ๋๋ ํ์ผ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ๋ณํ ์ํ ๊ฐ๋ฅ
sed [options] '๋ช
๋ น์ด' filename
# ์ต์
-i ํ์ผ์ ์ง์ ์์
-n ํจํด์ด ์ผ์นํ๋ ๋ผ์ธ๋ง ์ถ๋ ฅ
-e ์ฌ๋ฌ ๋ช
๋ น์ด ์ฌ์ฉ ์ ๋ช
๋ น์ด ๊ตฌ๋ถ
-r ํ์ฅ ์ ๊ท ํํ์์ ์ฌ์ฉํ ์คํฌ๋ฆฝํธ ์ฌ์ฉ
Shell
๋ณต์ฌ
โข
๋ด์ฅ ํจ์
s | substitute, ๋์ฒด |
d | delete, ์ญ์ |
p | print, ์ถ๋ ฅ |
a | append, ์ถ๊ฐ |
i | insert, ์ฝ์
|
c | change, ๋ณ๊ฒฝ |
y | transliterate, ๋ฌธ์ ๋ณํ |
q | quit, ์ข
๋ฃ |
โข
์์
# APPLE -> BANANA ๋ณ๊ฒฝ
sed 's/apple/banana/' products
# DRINK -> DRINKS, FRUIT -> FRUITS๋ก ๋ณ๊ฒฝ
sed 's/DRINK/DRINKS/g; s/FRUIT/FRUITS/g' products
sed -e 's/DRINK/DRINKS/g' -e 's/FRUIT/FRUITS/g' products
# g๋ ๋ชจ๋ ์ผ์น ํญ๋ชฉ์ ๋ปํจ. g๋ฅผ ์ฐ์ง ์์ผ๋ฉด ๊ฐ ์ค์ ์ฒ์ ๋ฐ๊ฒฌ๋ ํจํด๋ง ๋ณ๊ฒฝ๋จ
Shell
๋ณต์ฌ
# ๋ง์ง๋ง 10์ค ์ค 1 ~ 5 ๋ผ์ธ๋ง ์ถ๋ ฅ
tail /etc/passwd | sed -n '1,5p'
# ๋ง์ง๋ง 10์ค ์ค Daemon ํฌํจ ๋ผ์ธ๋ง ์ถ๋ ฅ
cat /etc/passwd | sed -n '/Daemon/p'
# ๋ง์ง๋ง 10์ค ์ถ๋ ฅ์ :๋ฅผ =๋ก ๋์ฒดํ์ฌ ์ถ๋ ฅ
tail /etc/passwd | sed 's/:/=/g'
Shell
๋ณต์ฌ