Featured image of post [Shell -SHARP0] Basic Shell Scripting Tutorial

[Shell #0] Basic Shell Scripting Tutorial

Shell ์—†์ด Terminal์€ ์ซŒ๐Ÿ˜ฅ

๋‚œ ํ„ฐ๋ฏธ๋„์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ๊ต‰์žฅํžˆ ์ข‹์•„ํ•œ๋‹ค. ์•„๋ฌด๋ž˜๋„ ๋งˆ์šฐ์Šค๊ฐ€ ๋”ฑํžˆ ํ•„์š” ์—†๊ณ  ๊ฐœ๋ฐœ์ž ํ–ฅ๊ธฐ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ? ๊ทธ๋ž˜์„œ ๋‹จ์ˆœํžˆ ํ„ฐ๋ฏธ๋„ ์ž‘์—…์šฉ์œผ๋กœ ๋งฅ๋ถ์„ ์ƒ€๊ณ  ๋”๊ตฌ๋‚˜ vi๋กœ ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ตฌ ๊ด€๋ จ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด Linux ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์ด๋‚˜ ์ฝ”๋“œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์–ด๋Š์ •๋„ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Commnad Line์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ shell ์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ์ข‹์€๊ฒŒ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

Basic Shell Script

  • date : ํ˜„์žฌ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ถœ๋ ฅ
1
2
date
2022๋…„ 3์›” 31์ผ ๋ชฉ์š”์ผ 17์‹œ 42๋ถ„ 47์ดˆ JST
  • cal : ํ˜„์žฌ ๋‚ ์งœ์˜ ์บ˜๋ฆฐ๋”๋ฅผ ์ถœ๋ ฅ (์‚ฌ์‹ค ์“ธ์ผ ์—†์Œ)
1
2
3
4
5
6
7
8
cal
      3์›” 2022
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
  • pwd : current working directory๋กœ ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅ
1
2
pwd
/Users/choiwonjun/Desktop
  • ls : ํ˜„์žฌ ๊ฒฝ๋กœ์˜ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถœ๋ ฅ (์ œ์ผ ๋งŽ์ด ์“ฐ์ž„)
1
2
ls
git  util

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์ณ๋„ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€๋งŒ ์•ž์œผ๋กœ ๋” ๋งŽ์€ ๋ช…๋ น์–ด์™€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” shell script๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  1. vi๋กœ ์ƒˆ๋กœ์šด shell ํŒŒ์ผ ์ƒ์„ฑ
1
vi task.sh
  1. vi์—์„œ i ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ insert ๋ชจ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑ ๐Ÿ“ƒ task.sh
1
2
3
4
date
cal
pwd
ls
  1. :wq ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ €์žฅ ํ›„ vi ์ข…๋ฃŒ
  2. chmod ๋ช…๋ น์–ด๋กœ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝ
1
chmod +x task.sh
  1. ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋จ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
./task.sh
2022๋…„ 3์›” 31์ผ ๋ชฉ์š”์ผ 18์‹œ 00๋ถ„ 38์ดˆ JST
      3์›” 2022
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

/Users/choiwonjun/Desktop
git  util

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ๋ช…๋ น์–ด๋กœ ๊ฐ„๋‹จํ•œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์•˜๋‹ค. ์‚ฌ์‹ค ๋ช…๋ น์–ด๋Š” ์—„์ฒญ ๋งŽ๊ณ  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋„ ๋งŽ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ฐจ์ฐจ ์•Œ์•„๊ฐ€๋„๋ก ํ•ด๋ณด์ž

Shell Macro

๋ช…๋ น์–ด์— ๋Œ€ํ•œ parameter ๊ต‰์žฅํžˆ ๋งŽ์ง€๋งŒ ๊ตณ์ด ์ง€๊ธˆ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹ˆ๋ฉด ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

  • man : ๋ช…๋ น์–ด ๋‹ค์Œ์— ์ž‘์„ฑํ•˜๋Š” ๋ช…๋ น์–ด์˜ ๋ฉ”๋‰ด์–ผ์„ ํ™•์ธ
1
man which
  • which : ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅ
1
2
which g++
/usr/bin/g++
  • echo : ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๊ฐ’์„ standard output์œผ๋กœ ์ถœ๋ ฅ
1
2
echo $SHELL
/bin/zsh
  • cp : ํŒŒ์ผ์„ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌ
1
cp ./task.sh ../task.sh
  • mv : ํŒŒ์ผ์„ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ (์ด๋ฆ„ ๋ณ€๊ฒฝํ• ๋•Œ๋„ ์‚ฌ์šฉ)
1
mv ./task.sh ./job.sh

์˜ˆ์•ฝ ๋ณ€์ˆ˜(Reserved Variable)

๋‹ค์Œ ๋ณ€์ˆ˜๋“ค์€ shell์— ๋‚ด์žฅ๋œ ๋ณ€์ˆ˜๋“ค๋กœ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— $๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๋Ÿฌ ์˜ˆ์•ฝ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณ  ์ค‘์š”ํ•œ ๊ฒƒ๋“ค๋งŒ ๋‚˜์—ดํ•ด ๋ณด๊ฒ ๋‹ค.

  • HOME : ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ
  • PATH : ์‹คํ–‰ ํŒŒ์ผ์„ ์ฐพ์„ ๊ฒฝ๋กœ
  • LANG : ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์‹œ ๊ธฐ๋ณธ ์ง€์›๋˜๋Š” ์–ธ์–ด
  • PWD : ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ๋””๋ ‰ํ† ๋ฆฌ
  • FUNCNAME : ํ˜„์žฌ ํ•จ์ˆ˜ ์ด๋ฆ„
  • SECONDS : ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ ์ดˆ ๋‹จ์œ„ ์‹œ๊ฐ„
  • SHLVL : ์‰˜ ๋ ˆ๋ฒจ(์ค‘์ฒฉ๋œ ๊นŠ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ„)
  • SHELL : ๋กœ๊ทธ์ธํ•ด์„œ ์‚ฌ์šฉ์ค‘์ธ ์‰˜ ์ข…๋ฅ˜
  • PPID : ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ PID
  • BASH, ZSH : SH ์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ
  • BASH_VERSION, ‘ZSH_VERSION` : ์„ค์น˜๋œ BASH/ZSH ๋ฒ„์ „
  • LOGNAME : ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ์ด๋ฆ„
  • UID : ์‚ฌ์šฉ์ž UID
  • USER, USERNAME : ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„
  • HISTFILE : history ํŒŒ์ผ ๊ฒฝ๋กœ
  • HISTSIZE : history ์ €์žฅ ๋˜๋Š” ๊ฐœ์ˆ˜

Redirection

์–ด๋–ค ํŒŒ์ผ์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋‚˜ ํ•ด๋‹น ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๊ต‰์žฅํžˆ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์„ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ต‰์žฅํžˆ ์‹ ๊ธฐํ•˜๊ณ  ํŽธํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

  • stdin, stdout, stderr 3๊ฐ€์ง€์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋‚˜๋‰จ
  • > : output redirection
    • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด $PATH ์ •๋ณด๊ฐ€ output.txt์— ๊ธฐ๋ก
    • ๊ธฐ์กด์— output.txt ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑ
1
echo $PATH > output.txt
  • $ command 2> file๋กœ ์ž‘์„ฑํ•˜๋ฉด stderr๋ฅผ file์— ๊ธฐ๋ก
  • >> : append redirection
    • ๊ธฐ์กด output ํŒŒ์ผ์— ์ด์–ด์„œ ์ถœ๋ ฅ
1
echo $HOME > output.txt
  • &> : stdout๊ณผ stderr๋ฅผ ํ•œ๋ฒˆ์— ์—ฐ๊ฒฐ

    • $ command $> file๋กœ ์‹คํ–‰์‹œ file์— ํ‘œ์ค€์ถœ๋ ฅ๊ณผ ํ‘œ์ค€์—๋Ÿฌ๊ฐ€ ๊ฐ™์ด ์ถœ๋ ฅ๋จ
  • < : input direction

    • stdin์„ ํ†ตํ•ด ํŒŒ์ผ์— ํ‘œ์ค€ ์ž…๋ ฅ
1
command < file
  • | : Pipe
    • ํ•œ ํ”„๋กœ์„ธ์Šค์˜ stdout์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ stdin์œผ๋กœ ์—ฐ๊ฒฐ
    • command1์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ command2๋กœ ์ž…๋ ฅ
1
command1 | command2
  • <, > : ํŒŒ์ผ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ
    • ํŒŒ์ผ์— ์ž…๋ ฅํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
1
command < input.txt > output.txt

๐Ÿฆ‰ ๋งˆ๋ฌด๋ฆฌ ๐Ÿฆ‰

๊ฐ„๋‹จํ•œ Shell Script ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ์ž‘ํ•œ ๊ธ€์ธ๋ฐ ์ž์„ธํžˆ ํŒŒ๋ณด๋‹ˆ๊นŒ ์ •๋ณด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค๐Ÿ˜ฅ ๊ทธ๋ž˜๋„ ๊ธฐ๋ณธ์ ์ธ Shell ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„์˜ ์ตœ์†Œ๋กœ ์•Œ์•„์•ผ ํ•˜๋Š” ์ง€์‹๋งŒ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. ์‚ฌ์‹ค ๋ณธ ๊ธ€์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์œผ๋กœ๋„ ๋šฑ๋•…๋šฑ๋•… ๋งŒ๋“ค๋ฉด ๊ทธ๋ž˜๋„ ๊ทธ๋Ÿด์‹ธํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๋‚˜์˜จ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—๋Š” Shell Script๋กœ CLI ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์ฑ„์  ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•ด ๋ณด๊ฒ ๋‹ค.

Built with Hugo
Theme Stack designed by Jimmy