๊ฐ์ด ๋ณด๋ฉด ์ข์ ๊ธ
[Linux/Unix] 03-1. bash metacharacter (*, ?, $, &)/echo ๋ช ๋ น์ด/Bash C printf() ๋ฌธ๋ฒ
๐งญ Bash ๋ฉํ๋ฌธ์ (Metacharacter)๋ฉํ๋ฌธ์(Metacharacter)๋ Bash์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ๋ ๊ธฐํธ๋ฅผ ๋งํ๋ค.ํ์ผ๋ช ํ์ฅ(globbing), ๋ช ๋ น ์คํ, ๋ณ์ ์นํ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ํํ๋ค.๐ 1) * (
lxvxxu.tistory.com
๐งฉ 1๏ธโฃ .sh ํ์ผ์ด๋?
.sh ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ์ Bash Shell Script (์ ธ ์คํฌ๋ฆฝํธ) ํ์ผ์ด์์.
์ฆ, Bash ๋ช ๋ น์ด๋ค์ ์์๋๋ก ์ ์ด ๋์ ์คํ ๊ฐ๋ฅํ ํ ์คํธ ํ์ผ์ ๋๋ค.
๐ ์ฝ๊ฒ ๋งํ๋ฉด
- ์ฐ๋ฆฌ๊ฐ ํฐ๋ฏธ๋์์ ํ๋์ฉ ์
๋ ฅํ๋ ๋ช
๋ น(echo, ls, cd, chmod, if, for ๋ฑ)์
ํ์ผ๋ก ์ ์ฅํด๋๊ณ ,
“ํ ๋ฒ์ ์คํ”ํ ์ ์๊ฒ ๋ง๋ ์๋ ์คํ ๋ช ๋ น์์์.
๐ง ์คํ ๋ฐฉ๋ฒ (2๊ฐ์ง)
๋ฐฉ๋ฒ 1๏ธโฃ: ์ง์ ์คํ (์คํ ๊ถํ ํ์)
chmod +x hello.sh # ์คํ ๊ถํ ์ถ๊ฐ
./hello.sh # ํ์ฌ ๋๋ ํฐ๋ฆฌ์์ ์คํ
๋ฐฉ๋ฒ 2๏ธโฃ: ํด์๊ธฐ(bash)๋ฅผ ์ง์ ์ง์
bash hello.sh
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์คํ ๊ถํ์ด ์์ด๋ ๊ฐ๋ฅํ์ง๋ง,
ํ์ผ์ ํญ์ Bash๋ก ์คํํด์ผ ํจ.
โ๏ธ ์ฒซ ์ค์ #!/bin/bash ์๋ฏธ
์ด ์ค์ Shebang(์๋ฑ
) ๋๋ Hashbang ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
“์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ค ํ๋ก๊ทธ๋จ์ผ๋ก ์คํํด์ผ ํ๋์ง”๋ฅผ ์๋ ค์ฃผ๋ ์ญํ ์ด์์.
๐ ๊ตฌ์กฐ
์๋ฅผ ๋ค์ด:
| #!/bin/bash | Bash๋ก ์คํ (๋ฆฌ๋ ์ค ๊ธฐ๋ณธ) |
| #!/bin/sh | ๊ธฐ๋ณธ ์์คํ ์ ธ๋ก ์คํ (์ผ๋ฐํ๋ ์ ธ) |
| #!/usr/bin/python3 | Python3๋ก ์คํ |
| #!/usr/bin/env node | Node.js๋ก ์คํ |
| #!/usr/bin/env bash | ํ๊ฒฝ ๋ณ์์์ bash๋ฅผ ์ฐพ์ ์คํ (์ด์์ฑ ๋์) |
๐ก ๋์ ๋ฐฉ์
์์ด ํ์ผ์ ์คํํ ๋:
- ์ฒซ ์ค์ด #! ๋ก ์์ํ๋ฉด,
๋ค์ ์๋ ๊ฒฝ๋ก(/bin/bash)์ ํ๋ก๊ทธ๋จ์ด ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํด์ํฉ๋๋ค. - ์ฆ, OS๊ฐ ์๋์ผ๋ก “์ด๊ฑด Bash๋ก ๋๋ ค์ผ ํ๋๊ตฌ๋”๋ผ๊ณ ์ธ์ํ๊ฒ ๋จ.
๐ง ์์ ๋น๊ต
| #!/bin/bash echo hello |
Bash์์ ์คํ๋จ |
| #!/usr/bin/python3 print("hello") |
Python์ผ๋ก ์คํ๋จ |
| (์๋ฑ
์์) echo hello |
ํ์ฌ ๋ก๊ทธ์ธ๋ ์(Bash, zsh ๋ฑ) ํ๊ฒฝ์ ๋ฐ๋ผ ์คํ๋จ |
๐ซ 3๏ธโฃ “๊ทธ๋ผ #!/bin/bash ๋ ๊ผญ ์จ์ผ ํด?”
โ ๋ฐ๋์ ์จ์ผ ํ๋ ๊ฑด ์๋,
ํ์ง๋ง **“์ถ์ฒ” ๋๋ “์ฌ์ค์ ํ์ค”**์ด์์.
| bash script.sh ๋ก ์ง์ ์คํ | โ ์์ด๋ ๋จ (bash๋ก ์ด๋ฏธ ์คํํ๊ธฐ ๋๋ฌธ) | |
| ./script.sh ๋ก ์ง์ ์คํ | โ ํ์ํจ (OS๊ฐ ์ด๋ค ์ธํฐํ๋ฆฌํฐ๋ก ๋๋ฆด์ง ์์์ผ ํจ) | |
| ๋ค๋ฅธ ์์คํ ์์๋ ์คํํ ์์ | โ ํ์ํจ (์ด์์ฑ↑, ๋ช ํ์ฑ↑) |
๐ก ๊ฒฐ๋ก :
๋จ์ ์ค์ต์ด๋ผ๋ฉด ์์ด๋ ๋์ง๋ง,
์คํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค๊ฑฐ๋ ๋ฐฐํฌํ ๋๋ ๋ฐ๋์ ๋ฃ๋ ๊ฒ ํ์ค์ด์์.
#!/bin/bash
var=defined
echo $var
echo ${var:-default}
echo ${var1:-default}
echo $var1
echo ${var1:=string}
echo $var1
echo ${var:+new}

๐งฉ ์ฝ๋ ์์ธ ํด์
์ด ์ฝ๋๋ Bash์ “๋งค๊ฐ๋ณ์ ํ์ฅ(Parameter Expansion)” ๋ฌธ๋ฒ์ ์คํํ๋ ์์์์.
:-, :=, :+ ๋ฑ์ ์ฐ์ฐ์๋ ๋ณ์๊ฐ ์ ์๋์ด ์๋์ง, ๋น์ด์๋์ง์ ๋ฐ๋ผ
๋์ฒด๊ฐ(default value) ์ ์ถ๋ ฅํ๊ฑฐ๋ ํ ๋น(assign) ํ๋ ์ญํ ์ ํฉ๋๋ค.
๐ง 1๏ธโฃ var=defined
- ๋ณ์ var ์ ๋ฌธ์์ด "defined" ๋ฅผ ํ ๋น.
- ์ฆ, var์ “์ ์๋์ด ์์(set)” ์ํ์ ๋๋ค.
๐งพ 2๏ธโฃ echo $var
- $var → ๋ณ์ var์ ๊ฐ ์ถ๋ ฅ.
- ๊ฒฐ๊ณผ: defined
๐งพ 3๏ธโฃ echo ${var:-default}
- ${var:-default} → var์ด ์ ์๋์ด ์์ผ๋ฉด ๊ทธ ๊ฐ์,
์ ์๋์ด ์์ง ์๊ฑฐ๋ ๋น ๊ฐ์ด๋ฉด(default) default๋ฅผ ์ถ๋ ฅ. - ํ์ฌ var="defined" → ์ ์๋์ด ์์ผ๋ฏ๋ก, ๊ธฐ์กด ๊ฐ ์ถ๋ ฅ.
โ ๊ฒฐ๊ณผ: defined
๐งพ 4๏ธโฃ echo ${var1:-default}
- ${var1:-default} → var1์ด ์ ์๋์ง ์์๊ฑฐ๋ null์ผ ๊ฒฝ์ฐ
์์๋ก(default) default๋ฅผ ์ถ๋ ฅ. - ๊ทธ๋ฌ๋ ์ค์ ๋ก var1์๋ ์๋ฌด ๊ฐ๋ ์ ์ฅ๋์ง ์์.
(์ด๊ฑด ๋จ์ํ ์ถ๋ ฅ๋ง ๋ฐ๊พผ ๊ฒ)
โ ๊ฒฐ๊ณผ: default
๐งพ 5๏ธโฃ echo $var1
- var1์ ์์ง๋ ์ ์๋์ง ์์(undefined) → ์ถ๋ ฅ ์์ (๋น ์ค)
โ ๊ฒฐ๊ณผ: (์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์)
๐งพ 6๏ธโฃ echo ${var1:=string}
- ${var1:=string} → var1์ด ์ ์๋์ง ์์๊ฑฐ๋ null์ด๋ฉด,
string์ ์ค์ ๋ก ๋ณ์์ ํ ๋น(assign) ํ๊ณ ์ถ๋ ฅํจ. - ์ด์ var1์ "string" ๊ฐ์ ๊ฐ์ง๊ฒ ๋จ.
โ ๊ฒฐ๊ณผ: string
๐งพ 7๏ธโฃ echo $var1
- ์ ๋จ๊ณ์์ var1="string"์ผ๋ก ์ค์ ๋ก ์ ์ฅ๋จ.
- ๋ฐ๋ผ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ string
โ ๊ฒฐ๊ณผ: string
๐งพ 8๏ธโฃ echo ${var:+new}
- ${var:+new} → var์ด ์ ์๋์ด ์๋ค๋ฉด new๋ฅผ ์ถ๋ ฅ.
(๊ฐ์ด ์ ์๋์ด ์์ง ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ์ถ๋ ฅ ์ ํจ) - ํ์ฌ var="defined" → ์กด์ฌํ๋ฏ๋ก "new" ์ถ๋ ฅ.
๋จ, ์ค์ ๋ณ์์ ๊ฐ(var)์ ๋ฐ๋์ง ์์.
โ ๊ฒฐ๊ณผ: new
๐งฎ ์ต์ข ์คํ ๊ฒฐ๊ณผ ์ ๋ฆฌ
| echo $var | defined | ๊ธฐ์กด ๋ณ์ ๊ฐ |
| echo ${var:-default} | defined | var์ด ์ ์๋์ด ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ถ๋ ฅ |
| echo ${var1:-default} | default | var1์ด ์ ์๋์ง ์์ ์์๋ก ๊ธฐ๋ณธ๊ฐ ํ์ |
| echo $var1 | (๋น ์ค) | var1์ ์ฌ์ ํ ์ ์๋์ง ์์ |
| echo ${var1:=string} | string | var1์ “string”์ด ์ค์ ๋ก ์ ์ฅ๋จ |
| echo $var1 | string | var1์ ๊ฐ ํ์ธ |
| echo ${var:+new} | new | var์ด ์ ์๋์ด ์์ผ๋ฏ๋ก “new” ์ถ๋ ฅ (๊ฐ ๋ณ๊ฒฝ ์์) |
๐ก ํต์ฌ ์ ๋ฆฌ — Bash ๋งค๊ฐ๋ณ์ ํ์ฅ ๋ฌธ๋ฒ
| ${var:-word} | var์ด unset/null์ด๋ฉด word ์ถ๋ ฅ | ${name:-guest} | name ์์ผ๋ฉด “guest” |
| ${var:=word} | var์ด unset/null์ด๋ฉด word๋ฅผ ๋์ ํ๊ณ ์ถ๋ ฅ | ${file:=readme.txt} | file์ “readme.txt” ์ ์ฅ |
| ${var:+word} | var์ด set์ด๋ฉด word ์ถ๋ ฅ, unset์ด๋ฉด ๋น ๋ฌธ์์ด | ${user:+logged-in} | user ์์ผ๋ฉด “logged-in” |
| ${var:?message} | var์ด unset/null์ด๋ฉด ์๋ฌ ์ถ๋ ฅ ํ ์ข ๋ฃ | ${id:?need id} | id ์์ผ๋ฉด ์๋ฌ ๋ฐ์ |
#!/bin/bash
echo "8๏ธโฃ \${unsetVar:?Error: unsetVar is not defined!} :"
echo ${unsetVar:?Error: unsetVar is not defined!}
echo "์ด ์ค์ ์คํ๋์ง ์์ต๋๋ค (์์์ ์ข
๋ฃ๋จ)"
unsetVar๊ฐ ์์ผ๋ฏ๋ก ์๋ฌ ์ถ๋ ฅ ํ ์คํฌ๋ฆฝํธ ์ข ๋ฃ, ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ
์คํ ๊ฒฐ๊ณผ :
8๏ธโฃ ${unsetVar:?Error: unsetVar is not defined!} :
bash: line 22: unsetVar: Error: unsetVar is not defined
โ ์๋ฌ ๋ฐ์ ์ ์คํฌ๋ฆฝํธ๋ ์ฆ์ ์ข
๋ฃ๋๋ฏ๋ก,
"์ด ์ค์ ์คํ๋์ง ์์ต๋๋ค" ๋ ์ถ๋ ฅ๋์ง ์์.
์ถ๊ฐ ์์ :
#!/bin/bash
echo ${HOME:?Home directory not found!}
echo ${PATH:?PATH variable is missing!}
echo ${MYVAR:?Custom variable is missing!}
โ ๊ฒฐ๊ณผ
- HOME, PATH๋ ์ ์๋์ด ์์ผ๋ฏ๋ก ์ ์ ํต๊ณผ
- MYVAR๋ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์๋ฌ ํ ์ข ๋ฃ:
bash: line 3: MYVAR: Custom variable is missing!
โ ํ ์ค ์์ฝ
์ด ์ฝ๋๋ Bash์์ ๋ณ์์ “์ ์ ์ฌ๋ถ”์ ๋ฐ๋ผ
๊ธฐ๋ณธ๊ฐ(:-), ๋์ (:=), ์กด์ฌ ์ ์นํ(:+)์ด ์ด๋ป๊ฒ ์๋ํ๋์ง๋ฅผ
์์๋๋ก ์คํํ๋ ์์ ์ ๋๋ค.
'6. CS ๊ธฐ์ด ๐ > Linux & Unix ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Linux/Unix][4-1] UNIX ํ์ผ ์ข ๋ฅ (0) | 2025.10.21 |
|---|---|
| [Linux/Unix][3-5] shift ๋ช ๋ น ํ๋ก๊ทธ๋จ (0) | 2025.10.21 |
| [Linux/Unix][3-3] ๐งฉ ํ์ผ ๊ถํ ๋ฐ ์์ ๊ถ ๊ด๋ฆฌ ๋ช ๋ น์ด: umask, chown, chgrp (0) | 2025.10.21 |
| [Linux/Unix][3-2] chmod ๋ช ๋ น (0) | 2025.10.21 |
| [Linux/Unix][3-1] bash metacharacter (*, ?, $, &)/echo ๋ช ๋ น์ด/Bash C printf() ๋ฌธ๋ฒ (0) | 2025.10.21 |