04A. Bash ์ตํ๊ธฐ
04A. Bash ์ตํ๊ธฐ ๊ด๋ จ
Docker๊ฐ ๋ฆฌ๋ ์ค ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ Bash(Bourne-again shell)๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์์ฃผ ์ฌ์ฉํ๋ Bash ๋ฌธ๋ฒ์ ๊ฐ๋จํ ์์๋ณด๊ฒ ์ต๋๋ค.
>
์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์
. ๋ช
๋ น ์คํ์ ํ์ค ์ถ๋ ฅ(stdout
)์ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค. ์ ๋์ค๊ณ์ด ์ด์์ฒด์ ๋ ์ฅ์น๋ ํ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ช
๋ น ์คํ ๊ฒฐ๊ณผ๋ฅผ ํน์ ์ฅ์น๋ก ๋ณด๋ผ ์๋ ์์ต๋๋ค.
echo "hello" > ./hello.txt
echo "hello" > /dev/null
<
์
๋ ฅ ๋ฆฌ๋ค์ด๋ ์
. ํ์ผ์ ๋ด์ฉ์ ์ฝ์ด ๋ช
๋ น์ ํ์ค ์
๋ ฅ(stdin
)์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
cat < ./hello.txt
>>
๋ช
๋ น ์คํ์ ํ์ค ์ถ๋ ฅ(stdout
)์ ํ์ผ์ ์ถ๊ฐํฉ๋๋ค. >
๋ ์ด๋ฏธ ์๋ ํ์ผ์ ๋ด์ฉ์ ๋ฎ์ด์ฐ์ง๋ง >>
๋ ํ์ผ ๋ท๋ถ๋ถ์ ๋ด์ฉ์ ์ถ๊ฐํฉ๋๋ค.
echo "world" >> ./hello.txt
2>
๋ช
๋ น ์คํ์ ํ์ค ์๋ฌ(stderr
)๋ฅผ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
2>>
๋ช
๋ น ์คํ์ ํ์ค ์๋ฌ(stderr
)๋ฅผ ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
&>
ํ์ค ์ถ๋ ฅ๊ณผ ํ์ค ์๋ฌ๋ฅผ ๋ชจ๋ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
1>&2
ํ์ค ์ถ๋ ฅ์ ํ์ค ์๋ฌ๋ก ๋ณด๋
๋๋ค. echo
๋ช
๋ น์ผ๋ก ๋ฌธ์์ด์ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํ์ง๋ง ํ์ค ์๋ฌ๋ก ๋ณด๋๊ธฐ ๋๋ฌธ์ ๋ณ์์๋ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ์ง ์์ต๋๋ค.
hello=$(echo "Hello World" 1>&2)
echo $hello
2>&1
ํ์ค ์๋ฌ๋ฅผ ํ์ค ์ถ๋ ฅ์ผ๋ก ๋ณด๋
๋๋ค. abcd๋ผ๋ ๋ช
๋ น์ ์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ์ง๋ง ์๋ฌ๋ฅผ ํ์ค ์ถ๋ ฅ์ผ๋ก ๋ณด๋ธ ๋ค ๋ค์ /dev/null
๋ก ๋ณด๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์ต๋๋ค.
abcd > /dev/null 2>&1
|
ํ์ดํ. ๋ช ๋ น ์คํ์ ํ์ค ์ถ๋ ฅ์ ๋ค๋ฅธ ๋ช ๋ น์ ํ์ค ์ ๋ ฅ์ผ๋ก ๋ณด๋ ๋๋ค. ์ฆ ์ฒซ ๋ฒ์งธ ๋ช ๋ น์ ์ถ๋ ฅ ๊ฐ์ ๋ ๋ฒ์งธ ๋ช ๋ น์์ ์ฒ๋ฆฌํฉ๋๋ค.
ls -al | grep .txt
$
Bash์ ๋ณ์์ ๋๋ค. ๊ฐ์ ์ ์ฅํ ๋๋ $๋ฅผ ๋ถ์ด์ง ์๊ณ , ๋ณ์๋ฅผ ๊ฐ์ ธ๋ค ์ธ ๋๋ง $๋ฅผ ๋ถ์ ๋๋ค.
hello="Hello World"
echo $hello
#
# Hello World
$()
๋ช ๋ น ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ํํฉ๋๋ค. ๋ช ๋ น ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ์ ์ฅํ๊ฑฐ๋ ๋ค๋ฅธ ๋ช ๋ น์ ๋งค๊ฐ ๋ณ์๋ก ๋๊ฒจ์ค ๋ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๋ฌธ์์ด์์ ๋ช ๋ น์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฃ์ ๋ ์ฌ์ฉํฉ๋๋ค.
sudo docker rm $(docker ps -aq)
echo $(date)
#
# Tue Sep 9 21:24:30 KST 2014
$()
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ช
๋ น ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ํํฉ๋๋ค.
sudo docker rm `docker ps -aq`
echo `date`
#
# Tue Sep 9 21:24:30 KST 2014
&&
ํ ์ค์์ ๋ช ๋ น์ ์ฌ๋ฌ ๊ฐ ์คํํฉ๋๋ค. ๋จ ์์ ์๋ ๋ช ๋ น์ด ์๋ฌ ์์ด ์คํ๋์ด์ผ ๋ค์ ์ค๋ ๋ช ๋ น์ด ์คํ๋ฉ๋๋ค.
make && make install
;
ํ ์ค์์ ๋ช ๋ น์ ์ฌ๋ฌ ๊ฐ ์คํํฉ๋๋ค. ์์ ์๋ ๋ช ๋ น์ด ์คํจ๋ฅผ ํด๋ ๋ค์ ์ค๋ ๋ช ๋ น์ด ์คํ๋ฉ๋๋ค.
false; echo "Hello"
Hello
' '
๋ฌธ์์ด์
๋๋ค. ' '
์์ ๋ค์ด์๋ ๋ณ์๋ ์ฒ๋ฆฌ๋์ง ์๊ณ ๋ณ์๋ช
๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ ์
$()
๋ ์ฒ๋ฆฌ๋์ง ์๊ณ ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
echo '$USER'
SER
$USER
๊ฐ ๊ทธ๋๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
" "
๋ฌธ์์ด์
๋๋ค. ๋ช
๋ น์ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์๋ฅผ ์
๋ ฅํ๊ฑฐ๋ ๋ณ์์ ์ ์ฅํ ๋ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ' '
์๋ ๋ฌ๋ฆฌ " "
์์ ๋ณ์๊ฐ ๋ค์ด์์ผ๋ฉด ๋ณ์์ ๋ด์ฉ์ผ๋ก ๋ฐ๋๋๋ค. ๋ํ ์
$()
๋ ์คํ ๊ฒฐ๊ณผ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
echo "Hello World"
Hello World
echo "$USER"
#
# pyrasis
echo "Host name is $(hostname)"
#
# Host name is ubuntu
echo "Time: `date`"
#
# Time: Tue Sep 9 21:28:10 KST 2014
" ' ' "
" "
์์ ' '
๊ฐ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. ๋ช
๋ น ์์์ ๋ค์ ๋ช
๋ น์ ์คํํ๊ณ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
bash -c "/bin/echo Hello 'World'"
#
# Hello World
\$hello
' '
์์์ "
๋ฅผ ์ฌ์ฉํ ๋๋ "
์ฒ๋ผ ์์ \
๋ฅผ ๋ถ์ฌ์ค๋๋ค.
bash -c "/bin/echo '{ \"user\": \"$USER\" }'"
#
# { "user": "pyrasis" }
" "
์์์ "
, $
, ๋ฑ์ ํน์๋ฌธ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ์์
`๋ฅผ ๋ถ์ฌ์ค๋๋ค.
echo "\$hello \" \`"
#
# $hello " `
${}
๋ณ์ ์นํ(substitution)์
๋๋ค. " "
๋ฌธ์์ด ์์์ ๋ณ์๋ฅผ ์ถ๋ ฅํ ๋ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ${}
๋์ $
๋ง ์ฌ์ฉํด๋ ๋ฉ๋๋ค.
str="World"
echo "Hello ${str}"
Hello World
์คํฌ๋ฆฝํธ์์ ๋ณ์์ ๊ธฐ๋ณธ ๊ฐ์ ์ค์ ํ ๋๋ ์ฌ์ฉํฉ๋๋ค. ๋ค์์ HELLO
๋ณ์๊ฐ ์์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ๋ณ์๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ค์ ํ abcd๋ฅผ ๋์
ํฉ๋๋ค.
HELLO=
HELLO=${HELLO-"abcd"}
echo $HELLO
๊ฐ์ด NULL
์ธ HELLO
๋ณ์๊ฐ ์ด๋ฏธ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๊ฐ์ ๋์
ํ์ง ์์ต๋๋ค. ๋ค์์ ๋ณ์์ ๊ฐ์ด ์์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ , ๊ฐ์ด NULL
์ด๋ฉด ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ค์ ํ abcd๋ฅผ ๋์
ํฉ๋๋ค.
WORLD=
WORLD=${WORLD:-"abcd"}
echo $WORLD
abcd
๋ณ์์ ๊ฐ์ด NULL
์ด๋ฏ๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋์
ํฉ๋๋ค.
\
ํ ์ค๋ก๋ ๋ช ๋ น์ ์ฌ๋ฌ ์ค๋ก ํํํ ๋ ์ฌ์ฉํฉ๋๋ค.
sudo docker run -d --name hello busybox:latest
sudo docker run -d \
--name hello \
busybox:latest
{1..10}
์ฐ์๋ ์ซ์๋ฅผ ํํํฉ๋๋ค. {์์ ์ซ์..๋ ์ซ์}
ํ์์
๋๋ค.
echo {1..10}
#
# 1 2 3 4 5 6 7 8 9 10
{๋ฌธ์์ด1,๋ฌธ์์ด2}
{}
์์ ๋ฌธ์์ด์ ์ฌ๋ฌ ๊ฐ ์ง์ ํ์ฌ ๋ช
๋ น ์คํ ํ์๋ฅผ ์ค์
๋๋ค. ๋ค์์ hello.txt
, world.txt
๋ ํ์ผ์ ํ๋ฒ์ hello-dir
๋๋ ํฐ๋ฆฌ ์๋์ ๋ณต์ฌํฉ๋๋ค.
cp ./{hello.txt,world.txt} hello-dir/
if
if ์กฐ๊ฑด๋ฌธ์ ๋๋ค. ๋ณ์์ ๋ณ์๋ผ๋ฆฌ ๋๋ ๋ฌธ์์ด๊ณผ ๋น๊ตํ ๋ ์ฌ์ฉํฉ๋๋ค.
if [ $a <span class="token parameter variable">-eq $b ]; then
echo $a
fi
์ซ์ ๋น๊ต
-eq
: ๊ฐ๋ค-ne
: ๊ฐ์ง ์๋ค-gt
: ์ด๊ณผ-ge
: ์ด์-lt
: ๋ฏธ๋ง-le
: ์ดํ
๋ฌธ์์ด ๋น๊ต
=
,==
: ๊ฐ๋ค!=
: ๊ฐ์ง ์๋ค-z
: ๋ฌธ์์ด์ด NULL์ผ ๋-n
: ๋ฌธ์์ด์ด NULL์ด ์๋ ๋
for
for ๋ฐ๋ณต๋ฌธ์ ๋๋ค. ๋ณ์์์ ์๋ ๊ฐ์ ๋ฐ๋ณตํ๊ฑฐ๋ ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
for i in $(ls)
do
echo $i
done
for (( i=0; i < 10; i++ ))
do
echo $i
done
NUM=(1 2 3)
for i in ${NUM[@]}
do
echo $i
done
while
while ๋ฐ๋ณต๋ฌธ์ ๋๋ค.
while :
do
echo "Hello World";
sleep 1;
done
<<<
๋ฌธ์์ด์ ๋ช ๋ น(ํ๋ก์ธ์ค)์ ํ์ค ์ ๋ ฅ์ผ๋ก ๋ณด๋ ๋๋ค.
cat <<< "User name is $USER"
#
# User name is pyrasis
<<EOF ... EOF
์ฌ๋ฌ ์ค์ ๋ฌธ์์ด์ ๋ช ๋ น(ํ๋ก์ธ์ค)์ ํ์ค ์ ๋ ฅ์ผ๋ก ๋ณด๋ ๋๋ค.
cat > ./hello.txt <<EOF
#
# Hello World
# Host name is $(hostname)
# User name is $(USER)
# EOF
cat
์ ํ์ผ์ด๋ ํ์ค ์
๋ ฅ์ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ๋ช
๋ น์
๋๋ค. cat
์ ํ์ค ์ถ๋ ฅ์ ./hello.txt
๋ก ์ ์ฅํ๊ณ , <<EOF๋ก
๋ฌธ์์ด์ cat์ ํ์ค ์
๋ ฅ์ผ๋ก ๋ณด๋
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์์ด 3์ค์ด ./hello.txt
ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค.
export
์ค์ ํ ๊ฐ์ ํ๊ฒฝ ๋ณ์๋ก ๋ง๋ญ๋๋ค. export <๋ณ์>=<๊ฐ>
ํ์์
๋๋ค.
export HELLO=world
printf
์ง์ ํ ํ์๋๋ก ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค. ํ์ดํ์ ์ฐ๋ํ์ฌ ๋ช ๋ น(ํ๋ก์ธ์ค)์ ๊ฐ์ ์ ๋ ฅํ๋ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
printf 80\\nexampleuser\\ny | example-config
#
# Port: 80
# User: exampleuser
# Save Configuration (y/n): y
์๋ฅผ ๋ค์ด example-config
๋ Port, User, Save Configuration์ ์ฌ์ฉ์์๊ฒ ์
๋ ฅ์ ๋ฐ์ต๋๋ค. printf
๋ก ๋ฏธ๋ฆฌ ๊ฐ์ ์ค์ ํ์ฌ ํ์ดํ๋ก example-config
์ ๋๊ฒจ์ฃผ๋ฉด ์ฌ์ฉ์๊ฐ ์
๋ ฅํ์ง ์์๋ ์๋์ผ๋ก ๊ฐ์ด ์
๋ ฅ๋ฉ๋๋ค. ์ค๋ฐ๊ฟ(๊ฐํ)์ \n
์ผ๋ก ํํํฉ๋๋ค.
sed
ํ
์คํธ ํ์ผ์์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํฉ๋๋ค. hello.txt
ํ์ผ์ ๋ด์ฉ ์ค์์ hello
๋ผ๋ ๋ฌธ์์ด์ ์ฐพ์์ world
๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํํฉ๋๋ค.
sed -i "s/hello/world/g" hello.txt
sed -i "s/<์ฐพ์ ๋ฌธ์์ด>/<๋ฐ๊ฟ ๋ฌธ์์ด>/g" <ํ์ผ๋ช
>
ํ์์
๋๋ค. /
์ ๊ฐ์ ํน์ ๋ฌธ์๋ ์์ \
๋ฅผ ๋ถ์ฌ /
๋ก ์
๋ ฅํฉ๋๋ค.
#
์ฃผ์์ ๋๋ค. ์คํฌ๋ฆฝํธ์ ์ค๋ช ์ ์ถ๊ฐํ๊ฑฐ๋, ๋ช ๋ น์ด ์คํ๋์ง ์๋๋ก ํฉ๋๋ค.
# echo "Hello World"