๐ ํด๋น ํฌ์คํ ์ ๋ชจ๋์ ๋ฆฌ๋ ์ค ์์ ์ ๋ด์ฉ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ์ ๋ฆฌ ๋ชฉ์ ํ์ ์์ฑ๋ ๊ธ์์ ์๋ฆฝ๋๋ค. ํฌ์คํ ๋ด์ฉ์ ๊ธฐ๋ฐ ๋ด์ฉ์ ํด๋น ์์ ์ ๊ธฐ๋ฐํ์์ผ๋ฉฐ ๋ด์ฉ ์์ฒด๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ ๋ฌด์์ด๊ณ , ์ ธ ์คํฌ๋ฆฝํธ์ ๊ธฐ์ด์ ๋๋ถ์ด ๊ธฐ์ด๋ฅผ ์์ ๋ค ์ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๋๋ก ํ์. ๊ฐ์ฅ ๋จผ์ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ๋ฌด์์ธ์ง ๊ฐ๋ ์ ์ผ๋ก ๋ฐฐ์๋ณด๋๋ก ํ์.
1. ์ฌ๋ฌ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ํ๋์ ํ์ผ๋ก ์คํํ์, ์ ธ ์คํฌ๋ฆฝํธ!
์ ธ ์คํฌ๋ฆฝํธ๋, ์ ธ์์ ์คํ๋ ํ๋ ๋๋ ๊ทธ ์ด์์ ์ปค๋งจ๋ ๋ผ์ธ์ ์ ๋ ฅํด ๋์ ํ์ผ์ด๋ค. ๋จ์ํ ๋ช ๋ น์ด๋ฅผ ์ฌ๋ฌ๊ฐ ๋์ดํ๋ ๊ฒ์ ๋์ด์์ ์กฐ๊ฑด ๋ถ๊ธฐ, ๋ฐ๋ณต๊ณผ ๊ฐ์ ๋ณต์กํ ์ ์ด๊ตฌ์กฐ๋ ์ํํ ์ ์๋ค. ๋ง์น Python ์ด๋ Java ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฒ๋ผ ๋ง์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ ธ ์คํฌ๋ฆฝํธ์์์ '์ ธ'์ด๋ ์ฐ๋ฆฌ๊ฐ ๋งจ ์ฒ์์ ์์๋ณธ bash, sh, zsh ๋ฑ ๋ค์ํ ์ ธ ์ข ๋ฅ ์ค ํ๋์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ด ์ฌ๋ฌ๊ฐ์ง ์ ธ ์ค์ ๊ณผ์ฐ ์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ๋์ง๋ ์ค์ํ ๋ฌธ์ ์ด๋ค. ์๋ํ๋ฉด ์ ธ ์คํฌ๋ฆฝํธ๋ ๊ทธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์ ธ์ด ์ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ ธ์ ๋ฐ๋ผ ์ ธ ์คํฌ๋ฆฝํธ์ ์ฐ์ฌ์ง๋ ๋ฌธ๋ฒ์ด ๋ฌ๋ผ์ง๋ค.
์ด์ ์๋ ๊ธด ์ญ์ฌ๋ฅผ ๊ฐ์ง sh ๋ผ๋ ์ ธ์ด ํธํ์ฑ๊ณผ ์ด์์ฑ์ด ์ค์ํ๋ค๋ฉด ์ ํธ๋๋ ์ ธ์ด์์ง๋ง ์์ฆ์๋ bash๊ฐ sh ๋ณด๋ค ๋ ๊ถ์ฅํ๋ ๋์ธ์ด๋ค. ์ด์ ๋ํ ์ด์ ๋ 2๊ฐ์ง์ด๋ค.
์ฒซ์งธ๋ก, sh๋ก ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด๋ ํธํ์ฑ์ ๋ฌธ์ ๋ ์ฌ์ ํ๋ค๋ ๊ฒ์ด๋ค. CentOS ๊ฐ์ ๋ ๋ํ ๊ณ์ด์ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์์๋ sh๋ bash์ ๋ณ๋ช ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ค. ์ฆ, ์ค์ฒด๋ bash๋ผ๋ ๊ฒ์ด๋ค.(๋ฌผ๋ก CentOS์์ sh๋ฅผ ์คํํ๋ฉด bash๊ฐ sh ๋ชจ๋๋ก ๋์ํด์ ๋์์ด ์ฝ๊ฐ ๋ณํ๊ธด ํ๋ค๊ณ ํจ) ๋ฐ๋ฉด, ์ฐ๋ถํฌ์ ๊ฐ์ ๋ฐ๋น์ ๊ณ์ด์์๋ sh๊ฐ bash ์ ธ์ ์ฌ์ฉํ๊ณ ์๋ค. ์ฆ, ๊ฒํฌ์ฅ์ง๋ sh์ด์ง๋ง ๋์ํ๋ ์ค์ฒด์ ์ธ ์ ธ์ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ณ ๋์๋ ๋ฌ๋ผ์ง๋ค. ์ด๋ฌํ sh์ ํน์ฑ์ ๋ฐํด, bash๋ GNU ํ๋ก์ ํธ๋ผ๋ ๊ฒ์ ์ํ ๊ตฌํ์ฒด ๋ฐ์ ์กด์ฌํ์ง ์๋๋ค. ์ด ๋ง์ ๊ณง ์ด๋ค ์ด์์ฒด์ ์ฌ๋ bash๋ ๋์ผํ๊ฒ ๋์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ต๊ทผ ๋ฆฌ๋ ์ค์์๋ bash๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋๊ธฐ ๋๋ฌธ์ bash๊ฐ sh๋ณด๋ค ํธํ์ฑ, ์ด์์ฑ์ด ๋ฎ๋ค๊ณ ํ๋ ๋ง์ ์๋ ์ด์ผ๊ธฐ์ธ ๋ฏ ํ๋ค.
๋๋ฒ์งธ๋ก๋ bash์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ํ๋ถํ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ฉด์ sh๋ ๊ธด ์ญ์ฌ๋ฅผ ๊ฐ์ง๊ธด ํ์ง๋ง bash ๋ณด๋ค ๋ง์ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์์ง ์๋ค. ์ผ๋ก๋ก, bash์์ ์ซ์ 1๋งํผ ๋ํ๋ ์ฐ์ฐ์ ํ ๋, sh๋ expr์ด๋ผ๋ ์ธ๋ถ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํด์ผ ํ๋ค.
์ฐ์ ์๋์ ๊ฐ์ ๊ฐ๋จํ ๋ด์ฉ์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ homesize.sh ์ด๋ผ๋ ํ์ผ๋ก ๋ง๋ค์ด๋ณด์.
#!/bin/bash
du -h ~/Desktop | tail -n 1
์ ๋ช ๋ น์ด๋ ~/Desktop ์ด๋ผ๋ ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ ์ฌ์ฉ๋์ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด์ด๋ค. ์ฐธ๊ณ ๋ก ์ ธ ์คํฌ๋ฆฝํธ์ ํ์ผ ํ์ฅ์๋ช ์ธ 'sh'๋ฅผ ๋ถ์ด์ง ์์๋ ๋์ํ์ง๋ง ๋ณดํต ํ์ผ ์ด๋ฆ๋ง ๋ด๋ ์ ธ ์คํฌ๋ฆฝํธ์ธ ๊ฒ์ ์ ์ ์๋๋ก ํ๊ธฐ ์ํด 'sh' ํ์ฅ์๋ช ์ ๋ถ์ด๋ ๊ฒ์ด ์ข๋ค. ๋ํ ํ์ผ ๋ด์ฉ์ค ๊ฐ์ฅ ์์ค์ #! ๋ก ์์ํ๋ ๋ถ๋ถ์ '์ ๋ฑ (shebang)' ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด์ ๋ํ ์ค๋ช ์ ํ๋ฐ๋ถ์ ํ๊ธฐ๋ก ํ๊ณ ์ฐ์ ๋์ด๊ฐ์. ์์ฒ๋ผ ๋ง๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค๋ ค๋ฉด ์ฐ์ ์คํ๊ถํ์ ๋ถ์ฌํด์ฃผ์ด์ผ ํ๋ค. ํด๋น ํ์ผ์ ๊ถํ ์ํ๋ฅผ ์๋์ฒ๋ผ ๋ณด๋ฉด ์์ ์, ์์ ๊ทธ๋ฃน, ๊ธฐํ ์ฌ์ฉ์ ๋ชจ๋ ์คํ ๊ถํ์ด ์ ํ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฐ์ "๋๋ง ์คํํ๋๋ก" ๋ง๋ค๊ธฐ ์ํด ์์ ์์๊ฒ๋ง ์คํ๊ถํ์ ๋ถ์ฌํด๋ณด๋๋ก ํ์. ์ฌ๊ธฐ์๋ ์๋์ ์ธ ๊ถํ ๋ถ์ฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ณด๋๋ก ํ์. ํน์ ๊ถํ ๋ถ์ฌ ๋ฐฉ๋ฒ์ ๋ํด ์ต์ํ์ง ์๋ค๋ฉด ์ด์ ํฌ์คํ ์ ์ฝ๊ณ ์ค์. ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ ํ, ๋ค์ ํ์ผ์ ๊ถํ ์ ๋ณด๋ฅผ ์ดํด๋ณด์.
chmod u+x homesize.sh
์ด์ ํด๋น ์ ธ ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํ๊ธฐ ์ํด ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋๋ค. ์ด ๋, ์ ธ์๊ฒ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ ๊ฒ์ด๋ผ๊ณ ./ ํํ๋ก ๋ฐ๋์ ์๋ ค์ฃผ์ด์ผ ํ๋ค.
./homesize.sh
๋ค์์ผ๋ก ๋ฐฉ๊ธ ์์์ ์ธ๊ธํ๋ ์ ๋ฑ ์ ๋ํด ์์๋ณด์. ์ ๋ฑ ์ ์ ธ ์คํฌ๋ฆฝํธ์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ํ์ #! ๋ก ์์๋๋ ๋ถ๋ถ์ด๋ค. ์ด ์ ๋ฑ ์ ์์ง ๋ชปํ๋ฉด ํน์ ํ๊ฒฝ์์ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ๋์ํ์ง ์์ ์ ์๋ค. ์๋ํ๋ฉด ์ด ์ ๋ฑ ์ด ์ด๋ค ์ ธ์ ์ด์ฉํด์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํฌ์ง ์ ์ธํ๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋ํ ์ผํ๊ฒ ์์๋ณด์. ์๋์ ๊ฐ์ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
#!/bin/bash
du -h ~/Destkop | tail -n 1
์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ฒ ๋๋ฉด ๊ฐ์ฅ ๋จผ์ ์ ธ์ ์คํ ๋ช ๋ น์ ์ ๋ฌ๋ฐ์ ๋ฆฌ๋ ์ค ์ปค๋์ด ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฒซ ๋ถ๋ถ์ ํ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ถ๋ถ์ #! ๊ฐ ์์ผ๋ฉด ๊ทธ ๋ค์์ ํ ๋ช ๋ น์ด ์ฆ, ์ ์ฝ๋์์๋ /bin/bash ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ ๋๋ค. ๊ฒฐ๊ตญ ์ ์ฝ๋์์์ ์ ๋ฑ ์ฆ, #!/bin/bash ์ ์๋ฏธ๋ "์ด ์ ธ ์คํฌ๋ฆฝํธ๋ /bin/bash๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋ช ์์ ์ผ๋ก ์ ์ธํ ๊ฒ์ด์ผ!"๋ผ๋ ์๋ฏธ์ด๋ค. ๊ทธ๋์ ์ ๋ฑ ์ด ์ ํ์ง ์ ธ ์คํฌ๋ฆฝํธ๋ ์๋์ฒ๋ผ ๋ฆฌ๋ ์ค ์ปค๋์ด ํ์ฅ๋๋ ๊ฒ์ด๋ค.
# ์ฌ์ฉ์๊ฐ ์
ธ ์คํฌ๋ฆฝํธ์ ์คํํ ๋ช
๋ น์ด
./homesize.sh
# ์ ๋ช
๋ น์ด๋ฅผ ๋ฆฌ๋
์ค ์ปค๋์ด ํ์ฅํ ๋ช
๋ น์ด
/bin/bash ./homesize.sh
์ด๋ ๊ฒ ์ ๋ฑ ์ ์ ๋ ฅํ๋ฉด ํฌ๊ฒ 2๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ค. ์ฒซ ๋ฒ์งธ๋ ๊ท์ฐฎ๊ฒ(?) ๋ช ๋ น์ด์ /bin/bash ๋ฅผ ์ ์ด์ฃผ์ง ์์๋ ๋๋ค. ๋ ๋ฒ์งธ๋ ๋ด๊ฐ ๋ก๊ทธ์ธํ๊ณ ์ฌ์ฉํ๊ณ ์๋ ์ ธ์ด bash๊ฐ ์๋ sh, zsh ์ ธ์ด์ฌ๋ ์ ๋ ๊ฒ bash ์ ๋ฑ ์ด ์ ํ์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋๋ bash ๋ฅผ ์ฌ์ฉํด์ ์คํํ๊ฒ ๋๋ค. ์ฐธ๊ณ ๋ก ์ ธ์์๋ #์ ์ฃผ์์ผ๋ก ๊ฐ์ฃผํ๋ค. ๋ฐ๋ผ์ ์ ๋ฑ ๋ ์ฃผ์์ผ๋ก ๊ฐ์ฃผ๋๊ธด ํ์ง๋ง ์ ธ ์คํฌ๋ฆฝํธ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ํ์ ํํด์๋ง #! ๊ฐ ์๋์ง ์ ธ์ด ํ์ธํ๊ฒ ๋๋ค.
์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ source ๋ช ๋ น์ด๊ฐ ์๋ค. ๋ฐฉ๊ธ ์์์ ์์๋ณธ ๋ฐฉ๋ฒ๊ณผ ์ฝ๊ฐ ์ฐจ์ด๊ฐ ์๋ค. ๊ทธ ์ฐจ์ด์ ์ source ๋ช ๋ น์ด๋ ์ ๋ฑ ์์ ์ง์ ํ ์ ธ์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋์ ํ์ฌ ์ฌ์ฉ์ค์ธ ์ ธ๋ก ์คํํ๋ค๋ ๊ฒ์ด๋ค. ์ฐ์ ์ ์๋์ ๊ฐ์ด ์ ๋ฑ ์ด ์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ source ๋ช ๋ น์ด๋ก ์คํํด๋ณด์.
source ./homesize-noshebang.sh
source ๋ช ๋ น์ด๋ ๋ง๊ทธ๋๋ก ์ง์ ํ ํ์ผ ์์ ์ปค๋งจ๋ ๋ผ์ธ์ ๋ง์น ์ ธ์์ ์ง์ ์ ๋ ฅํ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์คํํ๋ค. ๊ทธ๋์ ์ธ์ ๋ ํ์ฌ ์ ธ์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์์์ ์์๋ณธ ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ํ์ผ์ ์คํ ๊ถํ์ ๋ถ์ฌํ ํ์๊ฐ ์๋ค. ์ ธ์ ์คํํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ๋์ดํ๋ฉด ์๋์ ๊ฐ๋ค.
์ ธ์ ์คํํ๋ ๋ฐฉ๋ฒ | ํน์ง | |
./shell_script.sh | ์ ๋ฑ ์ ๋ช ์ํ ์ ธ๋ก ์คํ๋๋ฏ๋ก ์ ๋ฑ ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ๋ช ์ํด์ผ ํจ | ํ์ฌ ๋ก๊ทธ์ธํ ์ ธ๊ณผ ๋ณ๊ฐ์ ์๋ก์ด ์ ธ๋ก ์คํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ผ์ ์คํ๊ถํ์ ๋ถ์ฌํด์ฃผ์ด์ผ ํจ |
bash ./shell_script.sh | ์ ธ์ ์ธ์๋ก ์ง์ ํ์ฌ ์คํ | ์ ๋ฑ ์ ๊ธฐ์ฌํ์ง ์์๋ ๋จ.์๋? ์ด๋ฏธ bash๋ฅผ ์ธ ๊ฒ์ด๋ผ๊ณ ๋ช ๋ น์ด์ ์ ์ธํด์ฃผ์๊ธฐ ๋๋ฌธ |
source ./shell_script.sh | ๋ฌด์กฐ๊ฑด ํ์ฌ ์ฌ์ฉ์ค์ธ ์ ธ๋ก ์คํ๋จ | ๊ทธ๋์ ํด๋น ํ์ผ์ ๋ณ๋์ ์คํ ๊ถํ์ ๋ถ์ฌํ์ง ์์๋ ๋จ |
(bash,zsh)์ ํํ์ฌ... source ๋ . ๊ณผ ๋์ผํ ์๋ฏธ๋ฅผ ์ง๋ |
ex) . ./shell_script.sh ๋ ๋๊ฐ์ |
1๋ฒ์ ๊ฒฝ์ฐ, ์ ๋ฑ ์ ๊ธฐ์ฌํด์ผ ํ๋ค๋ ์ ๋ง ๋นผ๊ณ ๋ 2๋ฒ๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ๋์ํ๋ค. 3๋ฒ์ ๊ฒฝ์ฐ์๋ 1,2๋ฒ๊ณผ ๋์์์ ์ฐจ์ด์ ์ด ์๋ค. ๋ฐ๋ก 3๋ฒ์ ํ์ฌ ์ ธ์ ๊ธฐ์ค์ผ๋ก ์คํ๋๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ค์ ๋ ์ ธ ํ๊ฒฝ์ ์ํฅ์ ๋ฐ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ฌ ์ ธ์ ์ ์ฅํ ๋ณ๋ช ์ด๋ ์ ธ ๋ณ์๋ฅผ ์คํํ ์ ธ ์คํฌ๋ฆฝํธ ์์์๋ ์ฌ์ฉํ ์๊ฐ ์๋ค. ๋ฐ๋ฉด์ 1,2๋ฒ์ ๊ฒฝ์ฐ์ ํ์ฌ ๋ก๊ทธ์ธํ ์ ธ์์ ์๋ฅผ ๋ค์ด, $VAR ์ด๋ผ๋ ์ ธ ๋ณ์๋ฅผ ์ง์ ํ์์ง๋ผ๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์ ธ์ ๋ณ๋(์ด๋ฅผ ํ์ฌ ์ ธ์์ ์๋กญ๊ฒ ์คํ๋ ์์ ํ๋ก์ธ์ค๋ก์์ ์ ธ์ด๋ผ๊ณ ํด์ '์๋ธ ์ ธ'์ด๋ผ๊ณ ๋ถ๋ฆ)์ ์๋ธ ์ ธ์ด๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธํ ์ ธ์์ ์ ์ํ VAR ๋ณ์๋ฅผ ๊ฐ๋ค ์ฌ์ฉํ ์๊ฐ ์๋ค. ๋จ, ํ๊ฒฝ๋ณ์๋ฅผ ๋ชจ๋ ํ์ฌ ์ฌ์ฉ์ค์ธ ์ ธ๊ณผ ์๋ธ ์ ธ ๊ฐ์ ์ ๊ทผ์ด ๋ชจ๋ ๊ฐ๋ฅํ๋ค๋ ์ ๋ ์์ง๋ง์!
๊ทธ๋ ๋ค๋ฉด 3๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์ด๋ค ๊ฒ์ด ๊ฐ์ฅ ๊ถ๊ณ ๋ ๊น? ์ผ๋ฐ์ ์ผ๋ก ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋๋ 3๋ฒ ๋ฐฉ๋ฒ ์ฆ, source ๋ช ๋ น์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํ๋ค. ์๋ํ๋ฉด 1,2๋ฒ ๋ฐฉ๋ฒ์ ์ ๋ฑ ์์ ์ง์ ํ ์ ธ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ์ ธ๋ก๋ถํฐ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ ๋ฒ์งธ, source๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ์ ธ์ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ์คํ์ด ์๋ ์๋ ์๊ณ ํ์ฌ ์ ธ์ ๋ณ์๊ฐ์ด๋ ๋ณ๋ช (alias) ๊ฐ์ ์ค์๋ก ๋ฐ๊ฟ ์ ์๊ธฐ๋ ํ๋ค. ๋ฌผ๋ก source ๋ช ๋ น์ด๊ฐ ์ ์ฉํ ๋๋ ์๋ค. ์์ ํฌ์คํ ์์ ๋ฐฐ์ด ๊ฒ์ฒ๋ผ ๋ฐฐ์ ์ค์ ํ์ผ(./profile, ~/.bashrc ์ ๊ฐ์..)์ ๋ณ๊ฒฝํ ํ ๋ก๊ทธ์์ํ์ง ์๊ณ ๋ฐ๋ก ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ๋๋ source ๋ช ๋ น์ด๊ฐ ๋ฌด์๋ณด๋ค ์ ์ฉํ๋ค. ๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํด ์ฌ์ฉํ๋๋ก ํ์.
๋ค์์ ์ ธ ์คํฌ๋ฆฝํธ ๋ฐฐ์น์ ๋ํด ์์๋ณด์. ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ผ๋ช ์ ์ ์ด์ ์คํํ๋ ๋ฐฉ๋ฒ์ด ์์๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ์๋ฏธํ๋ ./ ๋ถ๋ถ์ ๋นผ๋ฉด ์คํ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค. ์์ผ๊น? ๋ฐ๋ก ๊ฒ์ ๊ฒฝ๋ก์์ ๋ช ๋ น์ด๋ฅผ ์ฐพ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐ๋ฆฐ ํน์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ ๋ OS๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋ช ๋ น์ด๋ค์ด ์ด๋ ์๋์ง ์ฐพ๋ '๊ฒ์ ๊ฒฝ๋ก'๋ผ๋ ๊ฒ ์กด์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ํ๊ฒฝ๋ณ์ $PATH์ ์ฝ๋ก (:)์ผ๋ก ๊ตฌ๋ถ๋์ด ์๋ค. ๋ด ๋ฆฌ๋ ์ค์์ ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ํ๋ฒ ๊ทธ๋ผ ์ดํด๋ณด์.
์ฆ, ์คํํ๊ณ ์ถ์ ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ์์ ๊ฐ์ ๊ฒ์ ๊ฒฝ๋ก์ ๋ฑ๋ก๋ ๋๋ ํฐ๋ฆฌ์ ์์ง ์์ผ๋ฉด ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ./ ๋นผ๊ณ ํ์ผ ์ด๋ฆ๋ง์ผ๋ก ์คํํ ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ํ์ผ ์ด๋ฆ๋ง์ผ๋ก ์คํํ๊ธฐ ์ํด์ ์ ๊ฒ์ ๊ฒฝ๋ก์ ๋ฑ๋กํด์ฃผ๋ฉด ๋๋ค. ํ์ฌ ๋ด๊ฐ ๋ง๋ homesize.sh ๋ผ๋ ์ ธ ์คํฌ๋ฆฝํธ๋ ~/Desktop/work/linux ๋ผ๋ ๋๋ ํ ๋ฆฌ์ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด ์๋ ๋ช ๋ น์ด๋ก ๊ฒ์ ๊ฒฝ๋ก์ ๋ฑ๋กํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ๋ค์ ๊ฒ์ํด๋ณด๋ฉด ๋ฐฉ๊ธ ๋ด๊ฐ ์ถ๊ฐํ ๋๋ ํ ๋ฆฌ๊ฐ ๊ฒ์ ๊ฒฝ๋ก์ ๋ฑ๋ก๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก PATH ํ๊ฒฝ๋ณ์๊ฐ ๋ค์ด์๋ ~/.profile ํ์ผ์ source ๋ช ๋ น์ด๋ฅผ ์ทจํด์ค์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ๋ก ์ ์ฉํด์ค๋ค.
๋ค์์ source ๋ช ๋ น์ด๋ก ์ฌ์ฉํ ๋ ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ ๋ํด ์์๋ณด์. source ๋ช ๋ น์ด๋ฅผ ์คํํ ๋๋ PATH ํ๊ฒฝ๋ณ์์ ์ง์ ๋ ๋๋ ํฐ๋ฆฌ์ ์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ผ๋ฉด ํด๋น ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋ ์๋/์ ๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ์ง ์๊ณ ๊ทธ๋ฅ ํ์ผ ์ด๋ฆ๋ง ๋ช ์ํด์ ์คํ์ํฌ ์๊ฐ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด ์ค์๋ก ์์น ์์ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค. ๋ฐ๋ผ์ ์๋/์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ์ ๋ ฅ์ผ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํฌ ์ ์๋๋ก ์ต์ ์ ์๋ ๋ช ๋ น์ด๋ก ๋นํ์ฑํ์ํฌ ์ ์๋ค.
# u๋ ๋นํ์ฑํ!
shopt -u sourcepath
๋ชฉ์ฐจ์ ๋ง์ง๋ง์ผ๋ก ssh์ ๊ณต๊ฐํค ์ธ์ฆ์ ๋ํด ์ ๊น ์์๋ณด์. ๋ฌ๊ธ์์ด ๋ฑ์ฅํ์ง๋ง ๋ด๊ฐ ๋ชฐ๋๋ ๋ด์ฉ์ด๋ผ ๊ธฐ๋กํด๋๋ ค ํ๋ค. ๋ณดํต ssh๋ก ๋ฆฌ๋ ์ค์ ๋ก๊ทธ์ธํ ๋ ์ํธ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์ํธ ์ธ์ฆ ๋ฐฉ์ ์ด์ธ์ ๊ณต๊ฐํค ์ธ์ฆ ๋ฐฉ์์ด๋ผ๋ ๊ฒ ์กด์ฌํ๋ค.
๊ณต๊ฐํค ์ธ์ฆ ๋ฐฉ์์ ssh-keygen ๋ช ๋ น์ด๋ก 2๊ฐ์ ํค๋ฅผ ์์ฑํ๋๋ฐ, ํ๋๋ ๋น๋ฐํค, ํ๋๋ ๊ณต๊ฐํค ํ์ผ์ด๋ค. ์ด ๋ ๊ณต๊ฐํค๋ ์๋ฒ์ ๋ฑ๋กํ๊ณ , ์ฌ์ฉ์๋ ๋น๋ฐํค๋ฅผ ์ด์ฉํด์ ๋ก๊ทธ์ธํ๊ฒ ๋๋ค. ์ฆ, ๊ณต๊ฐํค์ ๋์ํ๋ ๋น๋ฐํค์ฌ์ผ๋ง ์ธ์ฆ์ ์ฑ๊ณตํ๊ฒ ๋๊ณ ๋น๋ฐํค๋ ์๋ฒ์ ์ ์กํ์ง ์์ ์ฑ๋ก ์ธ์ฆ์ด ์งํ๋๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๊ณต๊ฐํค ์ธ์ฆ ๋ฐฉ์์ด ๋จ์ํ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ ๋ฐฉ์๊ณผ ๋ ์์ ํ๋ค.
๋ฌผ๋ก ๊ณต๊ฐํค ์ธ์ฆ ๋ฐฉ์์ผ๋ก๋ง ๋ก๊ทธ์ธํ ์ ์๋๋ก ssh๋ฅผ ์ค์ ํ ์๋ ์๋ค. ํ์ฌ๋ ์ธํฐ๋ท์ ๊ฒฝ์ ํด์ ssh๋ฅผ ์ฌ์ฉํ ๋๋ ๊ณต๊ฐํค ์ธ์ฆ ๋ฐฉ์๋ง ํ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ผ๊ณ ํ๋ค.
2. ์ ธ ์คํฌ๋ฆฝํธ์ ๊ธฐ์ด ์ง์
์ด๋ฒ ๋ชฉ์ฐจ์๋ ์ ธ ์คํฌ๋ฆฝํธ์ ๊ธฐ์ด ๋ฌธ๋ฒ์ ๋ํด ์์๋ณธ๋ค. ์ฐธ๊ณ ๋ก ์ฌ๊ธฐ์ ๋ฐฐ์ฐ๋ ๋ฌธ๋ฒ์ ์ ธ ์คํฌ๋ฆฝํธ์์ ์์ฑํด๋ ๋์ง๋ง ๋จ์ํ ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด ํํ๋ก๋ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ฐ์ ์ ธ ์คํฌ๋ฆฝํธ๋ ์ฒซ ๋ฒ์งธํ๋ถํฐ ์ฐจ๋ก๋ก ํ ํ์ฉ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ค. ์์๋ก ๋ค๋ฉด ์๋์ฒ๋ผ 3์ค์ ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๋ฉด 1์ค์ฉ ์์๋๋ก ์คํ๋๋ค.
๋ง์ฝ ํ๋์ ์ค๋ก ์ฐ๊ฒฐ ์ง์ผ๋ ค๋ฉด ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๋ช ๋ น์ด๋ฅผ ๊ตฌ๋ถํ ์๋ ์๋ค.
๋ง์ฝ ํ ์ค์ ์ปค๋งจ๋ ๋ผ์ธ์ด ๋๋ฌด ๊ธธ์ด์ ธ์ ๊ฐํ์ ํด์ผ ํ๋ค๋ฉด ์ญ์ฌ๋์ฌ(\)๋ก ๊ฐํ์์ผ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
์์ ์ฌ์ฉํ ๊ฐํ ํ์๋ ์ ธ์์ ์ปค๋งจ๋ ๋ผ์ธ์ ์ ๋ ฅํ ๋๋ ์ ์ฉํ ์ ์๋ค. ์ด ๋ ๊ฐํ์ ํ์ํ๋ฉด > ๋ผ๋ ํ์๊ฐ ํ๋กฌํํธ์ ํ์๋๋๋ฐ ์ด๋ ์ ๋ ฅ์ด ๋๋์ง ์์ ํ๋กฌํํธ๋ก ์ธ์ปจ๋๋ฆฌ ํ๋กฌํํธ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด ์ธ์ปจ๋๋ฆฌ ํ๋กฌํํธ๋ฅผ ํ์ํ๋ > ๋ผ๋ ๋ฌธ์ ์ข ๋ฅ๋ ๋ณ๊ฒฝํ ์ ์๋๋ฐ PS2 ์ ธ ๋ณ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
๋ค์์ ์ด์ ์ ์์๋ณด์๋ ์ ธ ๋ณ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ์ ธ ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ฃผ์์ ์ ๋ํด ๊ฐ๋จํ ์์๋ณด์.
- ๋์ ํ ๋๋ $๋ฅผ ๋ถ์ด์ง ์๋๋ค. ์ฐธ์กฐ ์์๋ง ๋ณ์๋ช ์์ ๋ถํ๋ค.
- ๋์ ์ ๋ฑํธ(=) ์ ์์ ๊ณต๋ฐฑ์ด ์์ด์ผ ํ๋ค. ex) VAR="Hello world" (O) , VAR = "Hello world" (X)
- ๋ณ์๋ช ์ ์ฌ์ฉํ ์ ์๋ ๋ฌธ์๋ก๋ ์ํ๋ฒณ, ์ซ์, ์ธ๋์ค์ฝ์ด(_)์ด๋ฉฐ ์ซ์๋ ์ฒซ ๊ธ์๋ก๋ ์ฌ์ฉ์ด ๋ถ๊ฐํ๋ค. ์ฐธ๊ณ ๋ก ๋ณดํต ํ๊ฒฝ๋ณ์๋ก๋ ์ํ๋ฒณ ๋๋ฌธ์๋ฅผ, ์ผ๋ฐ ๋ณ์์๋ ์ํ๋ฒณ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค
- ๋ณ์๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๊ธฐ ์ํด์ {}๋ฅผ ์ฌ์ฉํ๋ค. ex) filename="test.txt" ๋ผ๊ณ ์ ์ธํ ๊ฒฝ์ฐ, ํน์ ๋ฌธ์์ด Hello ์ ๋ถ์ด๊ณ ์ถ๋ค๋ฉด echo ${filename}Hello ์ด๋ผ๊ณ ์ ์ธํด์ผ ํจ
๋ค์์ ์ฟผํ (Quoting)์ ๋ํด ๋ฐฐ์๋ณด์. ์ฟผํ ์ด๋ ์์ ํน์ ํฐ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ฃผ๋ ๊ฒ์ด๋ค. ๋ฐฐ์์์๋ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ช ๋ น์ด ์ธ์๋ฅผ ๊ตฌ๋ถํ๋ค. ๊ทธ๋์ ์๋์ ๋ง๊ฒ ์ ์ ํ ์ฟผํ ์ ํด์ฃผ์ด์ผ ํ๋ค. ์์ ํน์ ํฐ ๋ฐ์ดํ๋ฅผ ํด์ฃผ๋ ๊ฒ ์ฌ์ด์๋ ํฐ ์ฐจ์ด์ ์ด ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ ๋ฐ์ดํ์์์ $๋ฅผ ํ์ํ๋ฉด ์ผ๋ฐ ๋ฌธ์์ด๋ก ์ทจ๊ธํ์ง๋ง ํฐ ๋ฐ์ดํ ์์์๋ ํด ๋ณ์ ๊ฐ์ผ๋ก ์นํ์ด ๋๋ค. ์๋ ํ๋ฉด์ ๋ณด์.
๊ฒฐ๊ณผ ํ๋ฉด์ ๋ณด๋ฉด ์์ ๋ฐ์ดํ์๋ $๋ฌธ์๊ฐ ๊ทธ๋๋ก ํ์๋์์ง๋ง ํฐ ๋ฐ์ดํ์๋ ์ ์ธํ ์ ธ ๋ณ์๊ฐ ์ง์ ๋์จ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ง์ฝ ํฐ ๋ฐ์ดํ์์๋ ๋ฌธ์๋ฅผ ๊ทธ๋๋ก ํ์ํด์ฃผ๊ณ ์ถ๋ค๋ฉด ์์ ์ด์ค์ผ์ดํ ๋ฌธ์์ธ ์ญ์ฌ๋์ฌ(\)๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
๋ค์์ ๋ช ๋ น์ด ์นํ์ ๋ํ ๋ด์ฉ์ด๋ค. ๊ฐ๋ ๋ช ๋ น์ด์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํ๊ณ ์ถ์ ๋๊ฐ ์๊ธด๋ค. ๋ฌผ๋ก ํ์ดํ๋ผ์ธ์ ์ด์ฉํด์ ํ์ค ์ ๋ ฅ์ผ๋ก ๋ฐ์๋ค์ด๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๋ช ๋ น์ด ์นํ์ ์ฌ์ฉํ ์๋ ์๋ค. ๋ช ๋ น์ด ์นํ์ $( ) ๊ฐ์ ํ์์ผ๋ก ๊ดํธ ์์ ์คํํ๋ ค๋ ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ์๋ ์์๋ฅผ ๋ณด์.
๋ช ๋ น์ด ์นํ ์ ์์์๋ ํฐ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์์ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค. ๋ช ๋ น์ด ์นํ์ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฑ์ฟผํธ(`)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํ๋ค. ์๋ฅผ ๋ค์ด, 2๊ฐ์ ํํ๋ฒ์ ๋ชจ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ฑ๋๋ค. ๋ ๊ฐ์ ๋ฐฉ๋ฒ ์ค์๋ ์ ์๋ฅผ ๋ ์ ํธํ๋ค๊ณ ํ๋ค.
echo Hello $(date '+%Y-%m-%d');
echo Hello `date '+%Y-%m-%d'`
๋ค์์ ์ ธ์ ์์น ํ๋ผ๋ฏธํฐ์ด๋ค. ์ ธ ์คํฌ๋ฆฝํธ์์๋ ์์น ํ๋ผ๋ฏธํฐ๋ผ๋ ์ ธ ๋ณ์๋ฅผ ์ฌ์ฉํด์ ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ ๋ค๋ฃฐ ์ ์๋ค. ์์น ํ๋ผ๋ฏธํฐ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ params.sh ๋ผ๋ ์ ธ ์คํฌ๋ฆฝํธ ๋ด์ฉ ์์๋ ์๋์ ๊ฐ์ ๋ด์ฉ์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ ์๋์ฒ๋ผ ๋์จ๋ค
์ ธ ๋ช ๋ น์ด ์ธ์๋ก ์ ๋ฌํด์ค ๊ฒ์ด ๊ทธ๋๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ์ ์๋ค. ๋ ๋ค๋ฅธ ์ฃผ๋ชฉํ ์ ์ 5๋ฒ์งธ ์ธ์์ธ $5๋ ์ถ๋ ฅํ๋ผ๊ณ ์ ธ ์คํฌ๋ฆฝํธ์ ๋ช ์ํ์๋๋ฐ, ๋ช ๋ น์ด๋ก 4๋ฒ์งธ ์ธ์๊น์ง๋ง ์ ๋ฌํด์ฃผ์๋ค. ๊ทธ๋ผ์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ ์๋ฌ๋ฅผ ๋ด์ง ์๊ณ ์ถ๋ ฅ๋๋ฉฐ ์ ๋ ฅ๋์ง ์์ 5๋ฒ์งธ ์ธ์์ ๋ํด์๋ ๋น ๊ฐ์ผ๋ก ์ถ๋ ฅ์ด ๋๋ค.
๋ค์์ผ๋ก๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ์ง์ ํ ์ธ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ฐธ์กฐ ๋ณ์ ์ข ๋ฅ์ ๋ํด ์์๋ณด์.
๋ณ์ | ์๋ฏธ |
$# | ์ ธ ์คํฌ๋ฆฝํธ ์คํ ์ ์ง์ ํ ์ธ์ ์ด ๊ฐ์ |
$@ | ์ธ์๋ฅผ ์ ์ฒด ์กฐํํ๋ ๊ฐ ์ธ์ง๊ฐ ๊ฐ๊ฐ์ ๋ฌธ์์ด๋ก ์ ๊ฐ๋จ |
$* | ์ธ์๋ฅผ ์ ์ฒด ์กฐํํ๋ ๊ฐ ์ธ์๊ฐ ํ๋์ ์ ์ฒด ๋ฌธ์์ด๋ก ์ ๊ฐ๋จ |
$0 | ์ ธ ์คํฌ๋ฆฝํธ ํ์ผ์ด๋ฆ |
$1, $2, ... | ์ปค๋งจ๋ ๋ผ์ธ ์ธ์์ ๊ฐ(์์น ํ๋ผ๋ฏธํฐ) |
๋ค์ ๋ชฉ์ฐจ์๋ ์ ธ ์คํฌ๋ฆฝํธ๋ก ๋ถ๊ธฐ, ๋ฐ๋ณต์ ์ํํ ์ ์๋ ์ ์ด ๊ตฌ์กฐ์ ๋ํด ์์๋ณด์. ์ ์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ if, for, while, case์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฅผ ๋ณตํฉ ๋ช ๋ น์ด(Compound command)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2-1. ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ถ๊ธฐํ์, if ๋ฌธ
if ๋ฌธ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ํ๊ฐํด์ ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋ฅผ ๋ถ๊ธฐํ๋ ์ ์ด ๊ตฌ์กฐ์ด๋ค. ์ ธ ์คํฌ๋ฆฝํธ์์๋ ๋ค์ฌ์ฐ๊ธฐ๋ก ํญ์ด๋ ๊ณต๋ฐฑ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ค์ฌ์ฐ์ง ์๋๋ค๊ณ ํด์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง๋ ์๋๋ค. if ๋ฌธ์ ์ด์ฉํ ๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณด์.
#!/bin/bash
arg="$1"
if [ "$arg" = "bin" ]; then
echo "Hello world!"
fi
if ๋ฌธ์์ ๋ฌธ๋ฒ์์ ์ฃผ์์ ์ด ๋ช ๊ฐ์ง ์๋๋ฐ ์๋์ ๊ฐ๋ค.
- ์กฐ๊ฑด์์ ์ด์ด ์ธ๋ฏธ์ฝ๋ก (;)์ ๋ถ์ฌ์ผ ํ๋ค. ๋จ, then ํค์๋๋ฅผ ๋ค์ ํ์ ๊ธฐ์ฌํ๋ฉด ์ธ๋ฏธ์ฝ๋ก ์ ์๋ตํ ์ ๋ ์์
- [ ]์ ๊ฐ ๊ธฐํธ ์ ,ํ์ ๋ฐ๋์ ๊ณต๋ฐฑ์ด ์์ด์ผ ํจ
๊ทธ๋ฆฌ๊ณ if ๋ฌธ ๋ค์ ์ค๋ ๊ฒ์ ์กฐ๊ฑด์์ด ์๋๋ผ ๋ช ๋ น์ด์ด๋ค. ์์ฒ๋ผ if ๋ค์ ์ค๋ [ ]์์ ์๋ ๊ฒ์ด ์กฐ๊ฑด์์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์ค์ ๋ก๋ ๋ช ๋ น์ด์ด๋ค. ์ฆ, [ ๋ก ์์ํ๋ ๋ฐฐ์์ ๋ด์ฅ ๋ช ๋ น์ด์ด๋ค. ๋ฏฟ์ง ๋ชปํ๋ค๋ฉด.. ์ ธ์์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ณ๋ณด์.
๋ฐ๋ผ์ [ ๋ ๋จ์ํ ๋๊ดํธ๊ฐ ์๋๋ผ ์ผ์ข ์ ๋ช ๋ น์ด ์ด๋ฉฐ if ๋ฌธ ๋ค์ ์๋ ๊ฒ์ ์ ธ ๋ช ๋ น์ด๋ก ์ ๋ ฅํ๊ฒ ๋๋ค๋ฉด ์๋ ๋ช ๋ น์ด๊ฐ ๋๋ค.
๊ทธ๋์ if ๋ฌธ์ ๋ค์ ์ค๋ ์กฐ๊ฑด์์ด ์๋ ๋ช ๋ น์ด์ด๊ณ , ์ด ๋ช ๋ น์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ํ๋ค. ์ผ๋จ ์ด ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๋จผ์ ๋ช ๋ น์ด์ ์ข ๋ฃ ์ํ์ ๋ํด ์์์ผ ํ๋ค. ๋ช ๋ น์ด์ ์ข ๋ฃ์ํ๋, ls ๋ grep ๊ฐ์ ๋ชจ๋ ๋ช ๋ น์ด๊ฐ ์คํ๋๊ณ ์ข ๋ฃ๋์์ ๋ ๋จ๋ ์ผ์ข ์ ์ ์ซ๊ฐ์ ๋ฐํํ๋๋ฐ ์ด ์ ์๊ฐ์ $? ๋ผ๋ ์ ธ ๋ณ์๋ก ํ์ธํ ์๊ฐ ์๋ค. ์๋์ฒ๋ผ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ์ข ๋ฃ์ํ๊ฐ์ ํ์ธํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ข ์ผ์ํ๊ฐ์ ๊ฐ์ฅ ์ง์ ์ ์ ๋ ฅํ ๋ช ๋ น์ด์ ์ข ๋ฃ์ํ ๊ฐ์ด๋ค.
์์์๋ ์ ๋ ฅํ ๋ช ๋ น์ด๊ฐ ์ ๋์ํ๊ณ ์ข ๋ฃ ์ํ๊ฐ์ด 0์ผ๋ก ๋์๋ค. ์ฆ, ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ฑ์๋ค๋ฉด ์ข ๋ฃ์ํ ๊ฐ์ 0์ด๊ณ , ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๋น์ ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด 0 ์ด์ธ์ ์ ์๊ฐ์ด ๋ฐํ๋๋ค. 0 ์ด์ธ์ ์ ์ ๊ฐ ๊ฐ๊ฐ์ด ์๋ฏธํ๋ ๋ฐ๋ ๋ง์น HTTP status ๊ฐ ์ข ๋ฅ๊ฐ ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ค๋ฅธ๊ฒ์ฒ๋ผ ๊ฐ๊ธฐ ์๋ฏธ๊ฐ ๋ค๋ฅด๋ค. ์ด์ ๋ํด์๋ ์ ๋ ฅํ ๋ช ๋ น์ด์ ๋งค๋ด์ผ์ ๋ณด๋ฉด ๋์จ๋ค.
์ด์ ์ข ๋ฃ์ํ์ ๋ํด์ ์์๋ณด์๋ค. [ ๋ช ๋ น์ด๋ ์ธ์๋ก ์ ๋จ๋ ์กฐ๊ฑด์ ์ญํ ์ ํ๋ ๋ช ๋ น์ด๋ฅผ ํ์ ํ์ฌ ์ฐธ์ด๋ฉด 0, ๊ทธ ์ธ์๋ 0์ด ์๋ ์ข ๋ฃ ์ํ๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ if ๋ฌธ์ ๋ฐํ๋ ์ข ๋ฃ์ํ ๊ฐ์ ๋ณด๊ณ 0์ด๋ฉด ์ฐธ์ผ๋ก ํ๋จํ๊ณ , ๊ทธ ์ด์ธ ์ซ์์ด๋ฉด ๊ฑฐ์ง์ผ๋ก ํ๋จํ๋ค. ๊ฒฐ๊ตญ, ์กฐ๊ฑด์ ์ญํ ์ ํ๋ ๋ช ๋ น์ด์ ์ข ๋ฃ์ํ๊ฐ์ด ์ ์ฅ๋์ด ์๋ $?๋ฅผ if ๋ฌธ์ด ๋์ ํ์ฌ ๋ด์ฃผ๊ณ ์ฐธ, ๊ฑฐ์ง์ ํ๋จํด์ฃผ๋ ์ ์ด๋ค!
์ฐธ๊ณ ๋ก, test ๋ช ๋ น์ด๋ผ๋ ๊ฒ๋ ์กด์ฌํ๋๋ฐ, [ ๋ช ๋ น์ด์ ๋๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด 2๊ฐ์ ์ฝ๋๋ ๋๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ค.
#!/bin/bash
arg="$1"
if [ "$arg" = "bin" ]; then
echo "Hello world!"
fi
#!/bin/bash
arg="$1"
if test "$arg" = "bin" ; then
echo "Hello world!"
fi
์ด์ [ ๋๋ test ๋ช ๋ น์ด์ ํ ๋นํ๋ ์กฐ๊ฑด์ ๋ช ๋ น์ด ์์์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์๋ฅผ ์ดํด๋ณด๋๋ก ํ์. ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฌธ์์ด ๋น๊ต, ์ ์ ๋น๊ต, ํ์ผ ์์ฑ, ์ฐ์ฐ์ ๊ฒฐํฉ๊ณผ ๊ด๋ จ๋ ์ฐ์ฐ์์ ๋ํด ์์๋ณด๋๋ก ํ์.
์ข ๋ฅ | ์ฐ์ฐ์ | ๋ด์ฉ | |
๋ฌธ์์ด ๋น๊ต | str1 = str2 | str1 ๊ณผ str2 ๊ฐ ๊ฐ์ | |
str != str2 | str1 ๊ณผ str2 ๊ฐ ๊ฐ์ง ์์ | ||
-n str1 | str1์ด ๋น ๋ฌธ์์ด์ด ์๋ | ||
-z str1 | str1์ด ๋น ๋ฌธ์์ด์ | ๋ณ์์ ๊ฐ์ด ํ ๋น๋์๋์ง ํ์ธํ๋ ์ฉ๋๋ก ์์ฃผ ์ฌ์ฉ | |
์ ์ ๋น๊ต | int1 -eq int2 | (equal) int1 ๊ณผ int2 ๊ฐ ๊ฐ์ | ์ ์ ๋น๊ต ์์๋ ์ ์๋ง ๋ค๋ฃธ. ์์์ ์ ๋ ฅํ๋ฉด ์๋ฌ ๋ฐ์ |
int1 -ne int2 | (not equal) int1 ๊ณผ int2 ๊ฐ ๊ฐ์ง ์์ | ||
int1 -lt int2 | (less than) int1 < int2 | ||
int -le int2 | (less equal) int1 <= int2 | ||
int -gt int2 | (greater than) int1 > int2 | ||
int -ge int2 | (greater equal) int1 >= int2 | ||
ํ์ผ ์์ฑ | -e file | file์ด ์กด์ฌํจ | |
-d file | file์ด ์กด์ฌํ๊ณ ๋๋ ํฐ๋ฆฌ์ | ||
-h file | file์ด ์กด์ฌํ๊ณ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ | -L file ์ฐ์ฐ์์ ๋์ผ | |
-f file | file์ด ์กด์ฌํ๋ฉฐ ์ผ๋ฐ ํ์ผ์ | ์ผ๋ฐ ํ์ผ์ด๋, ๋๋ ํ ๋ฆฌ๋ ์๋๊ณ ํน์ํ์ผ๋ ์๋ ํ์ผ ์๋ฏธ | |
-r file | file์ด ์กด์ฌํ๋ฉฐ ์ฝ๊ธฐ ๊ถํ์ด ๋ถ์ฌ๋์ด ์์ | ||
-w file | file์ด ์กด์ฌํ๋ฉฐ ์ฐ๊ธฐ ๊ถํ์ด ๋ถ์ฌ๋์ด ์์ | ||
-x file | file์ด ์กด์ฌํ๋ฉฐ ์คํ ๊ถํ์ด ๋ถ์ฌ๋์ด ์์ | ||
file1 -nt file2 | file1 is newer than file2 | file1 ๋ณ๊ฒฝ ์๊ฐ์ด ๋ ์ต์ ์๊ฐ์ | |
file1 -ot file2 | file1 is older than file2 | file1 ๋ณ๊ฒฝ ์๊ฐ์ด ๋ ๊ณผ๊ฑฐ ์๊ฐ์ | |
์ฐ์ฐ์ ๊ฒฐํฉ | ์กฐ๊ฑด์1 -a ์กฐ๊ฑด์2 | ์กฐ๊ฑด์ ๋ชจ๋๊ฐ ์ฐธ์ด๋ฉด ์ฐธ(AND ์กฐ๊ฑด) | |
์กฐ๊ฑด์1 -o ์กฐ๊ฑด์2 | ์กฐ๊ฑด์ ์ค ํ๋๊ฐ ์ฐธ์ด๋ฉด ์ฐธ(OR ์กฐ๊ฑด) | ||
! ์กฐ๊ฑด์ | ์กฐ๊ฑด์ ์ง์๊ฐ์ ๋ฐ๋๋ก(NOT) | ||
( ) | ์กฐ๊ฑด์์ ๊ทธ๋ฃนํ | -a, -o, ! ๋ก ์ฌ๋ฌ ์กฐ๊ฑด์์ ๊ฒฐํฉํ ๋ ์ฐ์ ์์๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ. ๋ฃ์ด์ค ๋ ๋ฐฐ์์ ๋ฉํ๋ฌธ์๋ก ์ฌ๊ฒจ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ด์ค์ผ์ดํ ๋ฌธ์(\)๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํจ |
|
์ฌ๋ฌ ๋ช ๋ น์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ํ๊ฐํ๋ ์ฐ์ฐ์ | ๋ช ๋ น์ด1 && ๋ช ๋ น์ด2 | ๋ช ๋ น์ด1์ด ์ ์ ์ข ๋ฃํ์ฌ ์ข ๋ฃ์ํ๊ฐ 0์ด ๋ฐํ๋ ๊ฒฝ์ฐ์๋ง ๋ช ๋ น์ด2๊ฐ ์คํ | ๊ทธ๋์ if ๋ฌธ์์ &&๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ๋ฃ ์ํ๊ฐ ๋ชจ๋ 0(์ ์)์ด๋ผ๋ AND ์กฐ๊ฑด์ ๊ธฐ์ ํ ์ ์์ |
๋ช ๋ น์ด1 || ๋ช ๋ น์ด2 | ๋ช ๋ น์ด1์ด ์ ์ ์ข ๋ฃ๋์ง ์์์ผ ๋ช ๋ น์ด2๊ฐ ์คํ | if ๋ฌธ์์ ||๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋ช ๋ น์ด ์ค ํ๋์ ์ข ๋ฃ ์ํ๊ฐ 0(์ ์)์ธ OR ์กฐ๊ฑด์ ๊ธฐ์ ํ ์ ์์ |
๋ง์ง๋ง์ผ๋ก ์ ธ ์คํฌ๋ฆฝํธ์ ์ข ๋ฃ ์ํ๊ฐ ์๋ค. ํน๋ณํ ๋ช ์ํ์ง ์์ผ๋ฉด ์ ธ ์คํฌ๋ฆฝํธ์ ์ ํ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ช ๋ น์ด ์ค ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ์คํ๋ ๋ช ๋ น์ด์ ์ข ๋ฃ ์ํ๊ฐ ๋๋ค. ๋ง์ฝ ๋ช ์์ ์ผ๋ก ์ข ๋ฃ ์ํ๋ฅผ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด exit ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์๋ ์ฒ๋ผ ์ง์ ํด์ค๋ค. ์ด๋ ๊ฒ ์ข ๋ฃ ์ํ๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํ๋ฉด ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถํ์ ๋ ์ ์ ํ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๋ค.
exit <์ข
๋ฃ์ํ ์ ์๊ฐ>
#!/bin/bash
if [ -z "$1" ]; then
exit 1
fi
ls "$1"
2-2. ํน์ ํ์๋งํผ ๋ฐ๋ณตํด์ ์ฒ๋ฆฌํ์, for ๋ฌธ
๋ค์์ for ๋ฌธ์ด๋ค. for ๋ ๊ณต๋ฐฑ์ด๋ ํญ์ผ๋ก ๊ตฌ๋ถ๋ ๋จ์ด ๋ฆฌ์คํธ์ ๋ํด ๋ฐ๋ณต์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๊ตฌ๋ฌธ์ด๋ค. ์๋์ ๊ฐ์ ํ์์ผ๋ก for ๋ฌธ์ ์์ฑํ ์ ์๋ค.
#!/bin/bash
for name in aaa bbb ccc
do
echo $name
done
๋ฆฌ์คํธ์ ๊ฒฝ๋ก ํ์ฅ์ ์ฌ์ฉํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด, csv ํํ์ ํ์ผ๋ง ๋ฆฌ์คํธ๋ก ๊ฐ์ ธ์์ ํ์ผ ์ด๋ฆ์ ์ถ๋ ฅ์ํค๋ ค๋ฉด ์๋์ฒ๋ผ ์ํํ๋ฉด ๋๋ค.
#!/bin/bash
for name in *.csv
do
echo $name
done
๋ํ ๋ช ๋ น์ด ์นํ์ ์ฌ์ฉํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด, ์์ด์ ์์ฑํ๋ seq ๋ช ๋ น์ด๋ก ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๋ช ๋ น์ด ์นํ์ผ๋ก ์ทจ๋ํ ํ for ๋ฌธ์ผ๋ก ์ถ๋ ฅํ๋ ๊ฒฐ๊ณผ์ด๋ค.
#!/bin/bash
for num in $(seq 1 9)
do
echo "$num"
done
๊ทธ๋ฆฌ๊ฑฐ for ๋ฌธ์๋ ์ปค๋งจ๋ ๋ผ์ธ ์ธ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ์์์ ๋ฐฐ์ด $@๋ฅผ ์ง์ ํ๋ฉด ์ ๋ ฅํ ์ปค๋งจ๋ ๋ผ์ธ ๋ชจ๋ ์ธ์๋ฅผ ๊ฐ๋ณ์ ์ธ ๋ฌธ์๋ก ๊ฐ์ฃผํ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฌธ์๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํ ์ ์๋ค. ์ฐธ๊ณ ๋ก ์ด ๋๊ฐ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋งค์ฐ ๋ง์์ ์๋ ์คํฌ๋ฆฝํธ์์ in ๊ณผ do ์ฌ์ด์ ๊ตฌ๋ฌธ์ ๋นผ์ ์คํํด๋ ๊ฒฐ๊ณผ๋ ๋๊ฐ๋ค. ํ์ง๋ง ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด์ ์ต๋ํ ๋ค ์ ๋ ฅํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
#!/bin/bash
for arg in "$@"
do
echo "$arg"
done
./argu_for.sh a b c d e f g h
2-3. ์ง์ ํ ๋ฌธ์์ด ํจํด์ ๋ฐ๋ผ ๋ถ๊ธฐํ๊ธฐ, case ๋ฌธ
๋ค์์ ์ง์ ํ ๋ฌธ์์ด์ ํจํด์ ๋ฐ๋ผ ๋ถ๊ธฐํ ์ ์๋ ์ ์ด ๊ตฌ์กฐ์ด๋ค. ์์ ์ Go ์ธ์ด๋ฅผ ์ ๊น ๋ฐฐ์ ์ ๋ case ๋ถ๊ธฐ๋ฌธ์ ๋ณธ์ ์ด ์๋๋ฐ, ์ ธ ์คํฌ๋ฆฝํธ์์๋ ๋น์ทํ ๊ฒ ๊ฐ๋ค. ์ด์ฐ๋๊ฑด case ์ฌ์ฉ๋ฒ์ ํจํด๊ณผ ์ธ๋ฏธ์ฝ๋ก ์ฌ์ด์ ์คํํ๊ณ ์ ํ๋ ์ฒ๋ฆฌ๋ฅด ์์ฑํ ์ ์๋ค. ํฌ๋งท์ ์๋์ ๊ฐ๋ค.
case <๋ฌธ์์ด> in
<ํจํด 1>)
์ฒ๋ฆฌ 1
;;
<ํจํด 2>)
์ฒ๋ฆฌ 2
;;
...
esac
์ฃผ์ํ ์ ์ ๋ฐ๋์ ํจํด์ ๋ช ์ํ๊ณ ๋์๋ ) ๋ฅผ ๋ถ์ฌ์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ ํ ์ ์๋ ํจํด ๊ฐ์์ ์ ํ์ ์๋ค. case ๋ฌธ์ ์์๋ ์๋์ ๊ฐ๋ค. ์ฐธ๊ณ ๋ก ํจํด์ ์์ผ๋์นด๋ ๋ฌธ์(*๋์์์ ๋ฌธ์์ด, ?๋ ์์์ ๋ฌธ์์ด 1๊ฐ)๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ๋ณดํต ์์ผ๋์นด๋ *๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ด๋ค ํจํด์๋ ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉํ๋ค. ์ถ๊ฐ์ ์ผ๋ก | ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์ ํ ์ฌ๋ฌ๊ฐ ํจํด ์ค ํ ํจํด์๋ง ์ผ์นํด๋(OR ์กฐ๊ฑด) ์ฒ๋ฆฌ๊ฐ ๋๋๋ก ํ ์ ์๋ค.
#!/bin/bash
for file in $(ls)
do
case "$file" in
*.sh)
echo this is shell script. its name is "$file"
;;
*.txt)
echo this is text file. its nmae is "$file"
;;
esac
done
2-4. ์ฐธ์ธ ์กฐ๊ฑด์ ๋ํด์๋ ๋ฌดํ ๋ฐ๋ณต, while ๋ฌธ
๋ค์์ ํน์ ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์ฐ์๋ง ๋ฌดํ loop๋ก ๋ฐ๋ณต์ ํ๋ while ๋ฌธ์ด๋ค. ์ฌ์ฉ ํฌ๋งท์ for ๋ฌธ๊ณผ ๊ฑฐ์ ๋น์ทํ๋ค.
while <๋ช
๋ น์ด>
do
๋ฐ๋ณต ์ฒ๋ฆฌ
done
์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ถ๊ฐ๋ก ์์๋์ด์ผ ํ ์ ์ด ์๋ค. ๋ฐ๋ก ๋ฐฐ์์์ ์ฐ์ ์ฐ์ฐ์๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋์ ๊ฐ์ด ๋ช ๋ น์ด ์นํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ฐ์ ์ฐ์ฐ์ ์ํํ ์ ์๋ค.
echo $((100+200))
๋ง์ฝ while ๋ฌธ์์ ์ฐ์ ์ฐ์ฐ์ ์ํํ๋ค๊ณ ํ๋ฉด ์๋์ ๊ฐ์ ์์๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
#!/bin/bash
i=1
while [ "$i" -le 10 ]
do
echo "$i"
i=$((i+1))
done
2-5. ์ ธ์์ ํจ์ ์ ์ํ๊ธฐ
๊ธฐ์ด์ ๋ง์ง๋ง์ผ๋ก ์ ธ ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ์ ธ ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฌ ๊ณณ์์ ์ค๋ณต์ผ๋ก ์ ๋ ฅ๋๋ ์ฒ๋ฆฌ๋ฅผ ํ๋์ ํจ์๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌํ ์๋ ์๋ค. ์ ธ ํจ์๋ function ์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ ๊ฐ์ ํฌ๋งท ํํ๋ก ์ ์ํ ์ ์๋ค. ๋จ, function ๋๋ ( ) ๋ ์ค ํ๋๋ฅผ ์๋ตํด์ ์ฒ๋ฆฌํ ์ ์๋ค.
# ํจ์ ์ ์ํ๋ 1๋ฒ ๋ฐฉ๋ฒ
function <ํจ์ ์ด๋ฆ> ()
{
์ฒ๋ฆฌ
}
# ํจ์ ์ ์ํ๋ 2๋ฒ ๋ฐฉ๋ฒ
function <ํจ์ ์ด๋ฆ>
{
์ฒ๋ฆฌ
}
# ํจ์ ์ ์ํ๋ 3๋ฒ ๋ฐฉ๋ฒ
<ํจ์ ์ด๋ฆ> ()
{
์ฒ๋ฆฌ
}
๋ณดํต 3๋ฒ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ๋ง์ด ์ฌ์ฉ๋๋ค๊ณ ํ๋ค. ์ ์ํ ์ ธ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํจ์ ์ด๋ฆ์ ๊ธฐ์ ํ๋ฉด ๋๋ค. ์๋ ์์๋ฅผ ์ดํด๋ณด์.
#!/bin/bash
dir_list ()
{
ls -al ./
}
๋ค์์ ์ ธ ํจ์ ์์์์ ํ๋ผ๋ฏธํฐ์ด๋ค. ์ ธ ํจ์ ์์์๋ ์์น ํ๋ผ๋ฏธํฐ์ธ $1, $2, ... ์ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ ์์น ํ๋ผ๋ฏธํฐ์๋ ์ปค๋งจ๋ ๋ผ์ธ ์ธ์๊ฐ ์๋๋ผ ํจ์์ ์ธ์ ๊ฐ์ด ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
#!/bin/bash
echo This is CLI argument: "$1"
print_params ()
{
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$4 = $4"
}
echo This is Function arguments
print_params aa bb cc
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํน์ดํ๊ฒ, ๋ช ๋ น์ด๋ฅผ ์๋ฏธํ๋ $0๋ผ๋ ํน์ ํ๋ผ๋ฏธํฐ๋ ์ ธ์ ์ด๋ป๊ฒ ์คํํ๋์ง์ ๋ฐ๋ผ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค. ๋จผ์ source ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด $0์๋ ํจ์ ์ด๋ฆ์ด ๋์จ๋ค. ํ์ง๋ง ํ์ผ ์ด๋ฆ์ผ๋ก ์คํํ๊ฒ ๋๋ฉด ์ ธ ์คํฌ๋ฆฝํธ ํ์ผ ์ด๋ฆ์ด ๋์ค๊ฒ ๋๋ค.
๋ค์์ ์ ธ ํจ์์ ์ข ๋ฃ ์ํ์ด๋ค. ์ ธ ํจ์ ์์์ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ง์ง๋ง์ผ๋ก ์คํ๋ ๋ช ๋ น์ด์ ์ข ๋ฃ ์ํ๊ฐ ์ ธ ํจ์์ ์ข ๋ฃ ์ํ๊ฐ ๋๋ค. ๋ง์ฝ ๋ช ์์ ์ผ๋ก ์ข ๋ฃ ์ํ์ ๊ฐ์ ๋ฐํํ๋ ค๋ฉด return ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. return ํค์๋๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ์ ธ ํจ์์ ์ฒ๋ฆฌ๊ฐ ์ข ๋ฃ๋๊ณ ํธ์ถํ ๊ณณ์ผ๋ก ์คํ ํ๋ฆ์ด ๋์๊ฐ๋ค. ๋ค์ ์์๋ฅผ ๋ณด์.
#!/bin/bash
checkparams ()
{
if [ -z "$1" ]; then
return 1
fi
cat < "$1"
}
file=~/Desktop/work/linux/file.txt
checkparams $file
echo "$?"
์ ์ฝ๋๋ฅผ ์คํํ์ ๋ ์ข ๋ฃ์ํ๋ ์ด๋จ๊น? ๋ฐ๋ก 0์ด ๋์จ๋ค. ์๋ํ๋ฉด checkparams ๋ผ๋ ํจ์ ์ธ์์ ์ ๋ ฅ์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ํจ์ ์ธ์์ ์๋ฌด๊ฒ๋ ๋ฃ์ง ์์ ์ฑ๋ก ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ ํด์ ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
#!/bin/bash
checkparams ()
{
if [ -z "$1" ]; then
return 1
fi
cat < "$1"
}
checkparams $file
echo "$?"
์ด๋ ๊ฒ ํ๋ฉด ์ข ๋ฃ์ํ๋ 1์ด ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์๋ํ๋ฉด checkparams ์์ return ํค์๋๋ฅผ ๋ง๋ฌ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ ์ํ์์ ์ข ๋ฃ ์ํ๊ฐ์ ๋ด ๋ง๋๋ก 1์์ 2๋ก ๋ฐ๊พผ ๋ค ์ถ๋ ฅํ๋ฉด ์ข ๋ฃ ์ํ๊ฐ์ด 2๋ก ๋์ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ ๊ฒ ํจ์์์๋ return ํค์๋๋ฅผ ์ฌ์ฉํด ์ข ๋ฃ์ํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ฒ ๋๋ฉด ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค.
#!/bin/bash
checkparams ()
{
if [ -z "$1" ]; then
return 2
fi
cat < "$1"
}
checkparams $file
echo "$?"
3. ์ ธ ์คํฌ๋ฆฝํธ ํ์ฉํ๊ธฐ
๋ง์ง๋ง ๋ชฉ์ฐจ์์๋ ์์์ ๋ฐฐ์์๋ ์ ธ ์คํฌ๋ฆฝํธ ๊ธฐ์ด ์ง์์ ํ์ฉํด์ ์ฐ์ต๋ฌธ์ ๋ฅผ ํ๋ ํ์ด๋ณด๋ฉด์ ์๋ก์ด ๋ด์ฉ๋ ํ์ตํด๋๊ฐ๋ณด์. ์ฐ์ ์ ธ ์คํฌ๋ฆฝํธ๋ ๊ธฐ์กด ๋ช ๋ น์ด๋ฅผ ์กฐํฉํด์ ์๋ก์ด ๋ช ๋ น์ด๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ํนํ, ๋ฆฌ๋ ์ค์ ๋ค์ํ ํํฐ๋ฅผ ์กฐํฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ์ ธ ์คํฌ๋ฆฝํธ์ ์ฒ ํ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ ธ ์คํฌ๋ฆฝํธ ๋ํ ํ๋์ ๋ช ๋ น์ด์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ ธ ์คํฌ๋ฆฝํธ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ์ฅ์ ๋ง์ด ์๋ ๊ฒ์ ์๋๋ค. ์ ธ ์คํฌ๋ฆฝํธ์๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ผ ๋๋ ์ ์ ํ์ง ๋ชปํ๋ค. ์ฒซ ๋ฒ์งธ๋ก, ๋๊ท๋ชจ ์์คํ ์์ ์ ํฉํ์ง ์๋ค. ์ ธ ์คํฌ๋ฆฝํธ์์๋ ๋ณ์ ํ์ ์ด ์์ผ๋ฉฐ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ช ์ด ๊ฐ์ด ๊ฐ๋ฐํ๋ ๋๊ท๋ชจ ๊ฐ๋ฐ์๋ ์ ํฉํ์ง ์๋ค. ๋ํ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ(IDE) ์ง์์ด ๋ถ์กฑํ๋ค.
๋ ๋ฒ์งธ๋ก๋ ๊ณ ์ฑ๋ฅ์ด ํ์ํ ์ฒ๋ฆฌ์์๋ ์ ํฉํ์ง ์๋ค. ์ ธ ์คํฌ๋ฆฝํธ๋ ํ ํ์ฉ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค. ์ฆ, ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ์ฒ๋ฆฌ(fork)๊ฐ ๋๋ฐ๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์ธ์ด์ ๋นํด ์คํ ์๋๊ฐ ๋๋ฆฐ ํธ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์ฐ์ต๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋๋ก ํ์. ํ์ด๋ณผ ๋ฌธ์ ๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ์ธ์๋ก ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํด์ฃผ๋ฉด ํด๋น ๋๋ ํฐ๋ฆฌ์ ์๋ ๋ชจ๋ ํ์ผ๊ณผ ์๋ธ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด๋ณด์.
3-1. Step01 : ์์ ๊ธฐ๋ฅ๋ถํฐ ์ฒ์ฒํ
์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ๋๋ ๊ฐ์ฅ ์์ ๊ธฐ๋ฅ๋ถํฐ ํ๋์ฉ ๋ง๋ค์ด๊ฐ๋ ๊ฒ์ด ์ข๋ค. ์ฐ์ ์ธ์๋ก ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ฉด ํด๋น ๋๋ ํฐ๋ฆฌ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ ์ ธ ์คํฌ๋ฆฝํธ๋ถํฐ ๋ง๋ค์ด๋ณด์.
#!/bin/bash
list_recursive() {
local filepath=$1
echo "$filepath"
}
list_recursive $1
ํจ์๋ฅผ ํ์ฉํด์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ๋ค. ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ฐ์ง ๋ชปํ ๋ฌธ๋ฒ์ด ๋์ค๋๋ฐ, ๋ฐ๋ก local ์ด๋ผ๋ ํค์๋์ด๋ค. local ์ ๋ณ์์ ์ ํจ ๋ฒ์๋ฅผ ์ง์ ํ๋ ํค์๋์ด๋ค. ํ์ด์ฌ์์์ global, local ํค์๋๋ฅผ ๋ฐฐ์ด ์ ์ด ์๋ค๋ฉด ์ต์ํ ๊ฒ์ด๋ค. ์ ธ ์คํฌ๋ฆฝํธ์์๋ ํ ๋ฒ ์ ์ธํ ๋ณ์๋ฅผ ํจ์ ์ํ์์ ๋์ ํ๊ฑฐ๋ ์ฐธ์กฐํ ์ ์๋ค. ๊ทธ๋์ ํจ์ ๋ด๋ถ ๋๋ ์ธ๋ถ์์ ์ด๋ค ๋ณ์๊ฐ์ ๋ฐ๊พผ๊ฒ์ด ์๋์น ์๊ฒ ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค. ๋ฐ๋ผ์ ์์ฒ๋ผ ํจ์ ๋ด์ local ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ๋ด์์๋ง ์ ํจํ ๋ณ์๋ก์จ ์ ์๋ฅผ ํด์ค๋ค.
3-2. Step02 : ํจ์๋ฅผ ์ฌ๊ทํธ์ถํ๊ธฐ
์ด์ ์ธ์๋ก ๋ฃ์ด์ค ๋๋ ํ ๋ฆฌ๊ฐ ๋น ๋๋ ํ ๋ฆฌ๊ฐ ์๋์ง ํ์ธํ๊ณ , ๋น ๋๋ ํ ๋ฆฌ๊ฐ ์๋๋ฉด ๋ฐ๋ณต๋ฌธ์ ํตํด์ ํด๋น ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ๋ค์ ์ ๋ถ ์ถ๋ ฅํด๋ณด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์.
#!/bin/bash
list_recursive() {
local filepath=$1
if [ -d "$filepath" ]; then
local fname
for fname in $(ls "$filepath")
do
echo "${filepath}/${fname}"
done
fi
}
list_recursive $1
๊ทธ๋ฐ๋ฐ ์ ์ ธ ์คํฌ๋ฆฝํธ๋ ์๋ธ ๋๋ ํ ๋ฆฌ ์์ ์๋ ํ์ผ๋ค๊น์ง๋ ๋ณด์ฌ์ฃผ์ง ๋ชปํ๋ค. ์ด ๋ ํ์ํ ๊ฒ์ด ๋ฐ๋ก ์๊ธฐ ์์ ํจ์๋ฅผ ํธ์ถํ๋ ์ฌ๊ท ํธ์ถ์ด๋ค. ์ฌ๊ท ํจ์๋ ํจ์ ์์ ์๊ธฐ ์์ ์ ํจ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ๋จ, ์ข ๋จ ์กฐ๊ฑด์ด ํ์ํ๋ฐ ์ฌ๊ธฐ์๋ if ์กฐ๊ฑด๋ฌธ์ด ๊ทธ ์ญํ ์ ํ๋ค.
#!/bin/bash
list_recursive() {
local filepath=$1
echo "${filepath}"
if [ -d "$filepath" ]; then
local fname
for fname in $(ls "$filepath")
do
list_recursive "${filepath}/${fname}"
done
fi
}
list_recursive $1
3-3. Step03 : ์ถ๋ ฅ ํ๋ฉด ์ด์๊ฒ ๋ง๋ค๊ธฐ
์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ๋ชจ๋ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ค์ด ๋์ค๊ธด ํ๋๋ฐ ์ค๋ณต๋๋ ์ ๋๊ฒฝ๋ก๊ฐ ๋ง๊ณ ์๋ธ ๋๋ ํ ๋ฆฌ, ์๋ธ ํ์ผ์ ์๋ฏธํ๋ ๋ค์ฌ์ฐ๊ธฐ๋ ์ ๋์ง ์๊ณ ์๋ค. ์ด 2๊ฐ๋ฅผ ์ถ๊ฐํด๋ณด์. ๋จผ์ ์ค๋ณต๋๋ ์ ๋๊ฒฝ๋ก๋ฅผ ์์ ๋ณด์.
์ ๋๊ฒฝ๋ก์์ ํ์ผ ์ด๋ฆ๋ง ์ถ์ถํ๊ธฐ ์ํด bash์ ํ๋ผ๋ฏธํฐ ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํจํด์ ํด๋นํ๋ ๋ถ๋ถ์ ์ ๊ฑฐํ ์ ์๋ค. ์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
${๋ณ์๋ช
##ํจํด}
์ ํจํด์ ์ผ์นํ๋ ๋ฌธ์์ด ์ค ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด์ด ์ ๊ฑฐ๋๋ค. ์ด์ ๊ด๋ จํ ๋ค๋ฅธ ํ๊ธฐ๋ฒ์ ์๋์ ๊ฐ๋ค.
ํ๊ธฐ๋ฒ | ์๋ฏธ |
${๋ณ์๋ช #ํจํด} | ์ ๋ฐฉ(์ผ์ชฝ) ์ต๋จ ๋งค์น๋ก ํจํด์ ์ผ์นํ๋ ๋ถ๋ถ ์ ๊ฑฐ |
${๋ณ์๋ช ##ํจํด} | ์ ๋ฐฉ(์ผ์ชฝ) ์ต์ฅ ๋งค์น๋ก ํจํด์ ์ผ์นํ๋ ๋ถ๋ถ ์ ๊ฑฐ |
${๋ณ์๋ช %ํจํด} | ํ๋ฐฉ(์ค๋ฅธ์ชฝ) ์ต๋จ ๋งค์น๋ก ํจํด์ ์ผ์นํ๋ ๋ถ๋ถ ์ ๊ฑฐ |
${๋ณ์๋ช %%ํจํด} | ํ๋ฐฉ(์ค๋ฅธ์ชฝ) ์ต์ฅ ๋งค์น๋ก ํจํด์ ์ผ์นํ๋ ๋ถ๋ถ ์ ๊ฑฐ |
๊ทธ๋์ */ ๋ผ๋ ํจํด์ด ๋ค์ด๊ฐ๋ฉด ๋ชจ๋ ๋ฌธ์์ด๊ณผ ์ฌ๋์ฌ(/)๋ก ์ด๋ฃจ์ด์ ธ์๋ ํจํด ์ค ๊ฐ์ฅ ๊ธด ๋ถ๋ถ์ ์ ๊ฑฐํ๋ผ๋ ์๋ฏธ์ด๋ฉฐ ๊ฒฐ๊ตญ ์ ๋ ๊ฒฝ๋ก ๋ถ๋ถ์ ์ญ์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
#!/bin/bash
list_recursive() {
local filepath=$1
echo "${filepath##*/}" # ์ ๋ ๊ฒฝ๋ก ์ญ์ !
if [ -d "$filepath" ]; then
local fname
for fname in $(ls "$filepath")
do
list_recursive "${filepath}/${fname}"
done
fi
}
list_recursive $1
๋ค์์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ถ๊ฐํด๋ณด์. ๋ค์ฌ์ฐ๊ธฐ ํ๋ ๋ถ๋ถ์ echo ๋ช ๋ น์ด ๋ถ๋ถ์ ์ถ๊ฐํด์ฃผ๋ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํด์ค ๋ ๋ค์ฌ์ฐ๊ธฐ(indent) ์ธ์์ ์์ ๊ณต๋ฐฑ์ ๋์นธ ์ถ๊ฐํด์ ํธ์ถํด์ฃผ๋๋ก ํ์.
#!/bin/bash
list_recursive() {
local filepath=$1
local indent=$2
echo "${indent}${filepath##*/}"
if [ -d "$filepath" ]; then
local fname
for fname in $(ls "$filepath")
do
list_recursive "${filepath}/${fname}" " ใด$indent"
done
fi
}
list_recursive $1 ""
3-4. Step04 : ์์ธ ์ํฉ ์ฒ๋ฆฌํ๊ธฐ
์ ์ ธ ์คํฌ๋ฆฝํธ๋ ํ์ผ๋ช ๋๋ ๋๋ ํฐ๋ฆฌ๋ช ์ด ๊ณต๋ฐฑ์ด ์์ง ์์ ๋ ์ ์ถ๋ ฅ์ด ๋๋ค. ํ์ง๋ง ๊ณต๋ฐฑ์ด ์๋ ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ ์ด๋ฆ์ด ์์ ๊ฒฝ์ฐ, ๊ณต๋ฐฑ์ ๊ตฌ๋ถ์ผ๋ก bash๊ฐ ๋จ์ด๋ฅผ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ์ด์ํ ์ถ๋ ฅํ๋ฉด์ด ๋์ฌ ์ ์๊ฒ ๋๋ค. ์ด๋ ๊ฒ bash๊ฐ ๋ด๋ถ์ ์ผ๋ก ๋จ์ด๋ฅผ ๊ตฌ๋ถํ๋ ๊ธฐ์ค์ IFS(Internal Field Seperator, ๋ด๊ตฌ ํ๋ ๊ตฌ๋ถ๋ฌธ์)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๊ฒ ๋ํ ํ๊ฒฝ ๋ณ์์ ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ IFS ๊ฐ์ ์ํ๋ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ด bash๊ฐ ์ค์ ํด์ค ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋จ์ด๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก ํด์ค ์ ์๋ค. for ๋ฌธ์ด๋ ์ปค๋งจ๋๋ผ์ธ ์ธ์๋ฅผ ๋ค๋ฃฐ ๋ ๋ชจ๋ IFS ํ๊ฒฝ๋ณ์ ๊ฐ์ ์ค์ ๋ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ์ด๋ฅผ ๊ตฌ๋ถํ๋ค.
IFS์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ์ ์ฐธ๊ณ ๋ก ๊ณต๋ฐฑ, ํญ, ๊ฐํ์ด๋ค. ํ์ฌ ์๋ง ๊ณต๋ฐฑ์ผ๋ก ์ค์ ๋์ด ์์ ํ ๋ ์๋์ ๊ฐ์ด IFS ๊ฐ์ ๊ฐํ์ผ๋ก ์์ ํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค. IFS๋ ํ๊ฒฝ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์คํ ์ ธ์์๋ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ, ๋ง์ฝ ์ด๋ค ์ ธ์์ IFS ๊ฐ์ ๊ฐํ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๊ณ ์๋ณต์์ผ๋์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ ธ์์ ๋ก์ง์ ์ํํ ๋ IFS ๊ฐ์ ๊ฐํ์ธ ์ํ๋ก ์ฐธ์กฐํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ IFS ๊ฐ์ ๋ฏธ๋ฆฌ ๋ฐฑ์ ํด ๋๊ณ IFS ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ค์ ํ ๋ค ์ํ๋ ๋ก์ง์ ์คํ ํ, ๋ค์ ๋ฐฑ์ ํด ๋ ผ ๊ฐ์ผ๋ก IFS ๊ฐ์ ์๋ณต์์ผ๋๋๋ก ํ์.
#!/bin/bash
_IFS=$IFS # ๋ฐฑ์
list_recursive() {
local filepath=$1
local indent=$2
echo "${indent}${filepath##*/}"
if [ -d "$filepath" ]; then
local fname
for fname in $(ls "$filepath")
do
list_recursive "${filepath}/${fname}" " ใด$indent"
done
fi
}
IFS=$'\n' # IFS ๊ฐ ๋ณ๊ฒฝ
list_recursive $1 ""
IFS=$_IFS # IFS ๊ฐ ์๋ณต
๋ค์์ xargs ๋ช ๋ น์ด ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด์. xargs ๋ช ๋ น์ด๋ฅผ ํ์ค ์ ๋ ฅ์ผ๋ก ์ธ์์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋๋ค. ์ฃผ๋ก find, grep ๋ช ๋ น์ด์ ๊ฐ์ด ์คํ๋๋๋ฐ, ์๋์ ๊ฐ์ ํฌ๋งท์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
xargs <์คํํ๋ ค๋ ๋ช
๋ น์ด>
์๋ฅผ ๋ค์ด, ํน์ ๋๋ ํ ๋ฆฌ์ txt ํ์ฅ์๋ก ๋ ํ์ผ๋ค์ ๋ํด ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
find . -name "*.txt" | xargs cat
๋ง์ง๋ง์ผ๋ก ๋์๋ง ํ์์ ๊ดํ ๋ช ๋ น์ด์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ๋ ์ค ๋ช ๋ น์ด์ --help ๋ผ๋ ์ต์ ์ ์ง์ ํ๋ฉด ๋์๋ง์ด ์ถ๋ ฅ๋๋ค. ์ด๋ฌํ ๋์๋ง๋ ์ง์ ์ ์ํ ์ ์๋ค. ์ด๋ฅผ ํ์ด ๋ํ๋จผํธ๋ผ๊ณ ํ๋๋ฐ, ์ฌ๋ฌ ํ์ ํ ์คํธ๋ฅผ ์ ธ ์คํฌ๋ฆฝํธ์์ ๊ทธ๋๋ก ๊ธฐ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์๋์ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ช
๋ น์ด << ์ข
๋ฃ ๋ฌธ์์ด
<ํ์ด ๋ํ๋จผํธ ๋ด์ฉ>
...
์ข
๋ฃ ๋ฌธ์์ด
์ฐธ๊ณ ๋ก ํ์ด ๋ํ๋จผํธ ์์์๋ ์ ธ ๋ณ์์ ํ์ฅ($์ ธ๋ณ์ ์ฒ๋ผ ์ ์ ๊ฐ๋ฅ)์ ์ฌ์ฉํ ์ ์๋ค. ํน์ฌ๋ผ๋ ๋ณ์ ํ์ฅ์ ์ํ์ง ์๋๋ค๋ฉด ์ข ๋ฃ ๋ฌธ์์ด์ ์์ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.
๋ช
๋ น์ด << '์ข
๋ฃ ๋ฌธ์์ด'
<ํ์ด ๋ํ๋จผํธ ๋ด์ฉ>
...
์ข
๋ฃ ๋ฌธ์์ด
๋ช ๋ น์ด | ์๋ฏธ |
basename <ํ์ผ ๊ฒฝ๋ก> | ์ง์ ํ <ํ์ผ ๊ฒฝ๋ก>์์ ๊ฐ์ฅ ํ์์ ๋๋ ํฐ๋ฆฌ ๋๋ ํ์ผ ์ด๋ฆ๋ง์ ์ถ์ถ |