Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

실전 예제 5가지로 배우는 Bash 스크립팅 입문 가이드

실전 예제 5가지로 배우는 Bash 스크립팅 입문 가이드진행 중인 Unix Sed, Unix Awk 시리즈에 이어, 이번에는 Bash 스크립팅 연재 기획입니다. 실무에서 바로 활용할 수 있는 예제를 통해 Bash 스크립팅의 핵심 기법을 하나씩 살펴보겠습니다.

쉘(Shell)이란 무엇인가?

쉘(Shell)은 사용자가 입력한 명령을 해석하는 프로그램입니다. 명령은 사용자가 직접 입력하거나, 쉘 스크립트(shell script)라고 불리는 파일에서 읽어옵니다.

사용자의 입력을 직접 받아 처리할 때는 대화형(interactive) 쉘이라고 부릅니다.

반면, 파일에서 명령을 읽어 실행할 때는 비대화형(non-interactive) 쉘이라고 합니다. 이 경우 쉘은 스크립트 파일의 각 줄을 위에서 아래로 순서대로 읽으면서, 마치 사용자가 직접 입력한 것처럼 명령을 하나씩 실행합니다.

현재 쉘이 대화형인지 비대화형인지 확인하려면 내장 쉘 변수인 $-의 값을 출력하면 됩니다.

# echo $-
himBH

참고: 쉘이 대화형일 경우 $- 변수 값에 "i"가 포함되어 있습니다.

유닉스의 다양한 쉘 종류

유닉스에는 여러 종류의 쉘이 존재합니다. 대표적으로 Bourne shell(sh), Bourne again shell(bash), C shell(csh), Korn shell(ksh), Tenex C shell(tcsh) 등이 있습니다. which 또는 whereis 명령을 사용하면 특정 쉘이 설치된 위치를 확인할 수 있습니다.

# which bash
/bin/bash

# whereis bash
bash: /bin/bash /usr/share/man/man1/bash.1.gz

쉘 이름을 입력하기만 하면 쉘 간 전환이 가능합니다. 예를 들어 csh를 입력하면 C 쉘로 전환됩니다.

쉘 스크립트 작성 및 실행 방법

예제 1. Hello World Bash 스크립트

  1. 선호하는 편집기를 사용해 파일에 다음 두 줄을 입력하여 스크립트를 생성합니다.
  2. $ cat helloworld.sh
    #!/bin/bash
    echo Hello World
  3. 파일 이름은 자유롭게 정할 수 있지만, 유닉스 내장 명령과 같은 이름은 피해야 합니다.
  4. 스크립트는 항상 두 글자 '#!'로 시작하며, 이를 she-bang(셔뱅)이라고 부릅니다. 이는 해당 파일이 스크립트임을 알리고, 첫 줄의 나머지 부분에 지정된 인터프리터(/bin/bash)로 실행해야 한다는 의미입니다.
  5. 아래와 같이 스크립트를 실행합니다. 실행에 문제가 있다면 쉘 스크립트 실행 관련 튜토리얼을 참고하세요.
  6. $ bash helloworld.sh
    Hello World
  7. bash helloworld.sh 명령을 실행하면 비대화형 쉘이 시작되고, 파일명이 인수로 전달됩니다.
  8. 첫 번째 줄은 운영체제에 스크립트를 실행하기 위해 어떤 쉘을 띄워야 하는지 알려주는 역할을 합니다.
  9. 위 예제에서는 bash 인터프리터가 스크립트를 해석하며, 명령을 위에서부터 아래로 하나씩 차례로 실행합니다.
  10. bash 명령 없이도 스크립트를 실행할 수 있습니다.
    • chmod u+x helloworld.sh 명령으로 스크립트에 사용자(User) 실행 권한을 부여합니다.
    • 스크립트가 위치한 디렉터리가 PATH 환경 변수에 포함되어 있어야 합니다. 포함되어 있지 않다면 스크립트의 절대 경로를 지정하여 실행할 수 있습니다.
  11. echo는 인수로 받은 내용을 그대로 출력하는 명령입니다. 변수 값을 출력할 때도 사용됩니다.

Bash 시작 파일(Startup Files)

앞서 .bash_profile 관련 파일의 실행 순서에서 설명했듯이, bash가 대화형 쉘로 실행되면 먼저 /etc/profile의 명령을 읽어 실행합니다. /etc/profile이 존재하지 않으면 ~/.bash_profile, ~/.bash_login, ~/.profile 순서로 명령을 읽어 실행합니다. 쉘 시작 시 --noprofile 옵션을 사용하면 이러한 동작을 생략할 수 있습니다.

일반적으로 bash_profile은 ~/.bashrc를 실행합니다. 원한다면 환영 메시지를 표시할 수도 있는데, 이는 최초 로그인 시에만 실행됩니다. 필요한 변수를 export 하거나, 쉘을 열 때 바로 사용할 수 있는 alias를 설정할 수도 있습니다. 로그인 쉘이 종료될 때는 Bash가 ~/.bash_logout 파일의 명령을 읽어 실행합니다.

예제 2. 로그인 시 환영 메시지 출력하기

bash_profile 파일에 아래 내용을 입력합니다. 파일이 존재하지 않는다면 새로 생성하면 됩니다.

$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."

대화형 쉘에 로그인하면 다음과 같은 환영 메시지가 화면에 표시됩니다.

login as: root
root@dev-db's password:
Welcome on dev-db

예제 3. 시스템 정보 출력하기

대화형 쉘에 로그인할 때 서버에 설치된 커널 이름, bash 버전, 업타임(uptime), 서버 시간 등의 시스템 정보를 함께 표시할 수 있습니다.

$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."

echo -e "Kernel Details: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Uptime: "; uptime
echo -ne "Server time : "; date

대화형 쉘을 실행하면 아래와 같은 메시지가 출력됩니다.

login as: root
root@dev-db's password:
Welcome on dev-db

Kernel Information:  Linux 2.6.18-128 x86_64
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Uptime:  11:24:01 up 21 days, 13:15,  3 users,  load average: 0.08, 0.18, 0.11
Server time : Tue Feb 22 11:24:01 CET 2010

예제 4. 마지막 로그인 정보 출력하기

여러 사용자가 동일한 계정으로 같은 머신을 공유하는 환경이라면, 마지막으로 어느 장비에서 로그인했는지, 언제 로그인했는지에 대한 정보가 매우 유용합니다. 이 예제는 대화형 쉘이 시작될 때 마지막 로그인 정보를 출력합니다.

$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."

echo -e "Kernel Details: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Uptime: "; uptime
echo -ne "Server time : "; date

lastlog | grep "root" | awk '{print "Last login from : "$3;
print "Last Login Date & Time: ",$4,$5,$6,$7,$8,$9;}'

시작 과정에서 아래와 같은 메시지를 확인할 수 있습니다.

login as: root
root@dev-db's password:
Welcome on dev-db

Kernel Information:  Linux 2.6.18-128 x86_64
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Uptime:  11:24:01 up 21 days, 13:15,  3 users,  load average: 0.08, 0.18, 0.11
Server time : Tue Feb 22 11:24:01 CET 2010

Last login from : sasikala-laptop

Last Login Date & Time:  Tue Feb 22 11:24:01 +0100 2010

예제 5. 시작 시 변수 export 및 alias 설정하기

.bashrc와 .bash_profile 파일에서 가장 많이 사용되는 명령은 바로 exportalias입니다.

alias는 특정 텍스트를 다른 텍스트로 치환하는 기능입니다. alias를 실행하면 입력한 명령이 alias에 설정된 값으로 자동 대체됩니다. 예를 들어 ls 명령이 파일과 폴더를 색상으로 구분해 보여주도록 alias를 설정하려면 다음과 같이 작성합니다.

alias ls 'ls --color=tty'

이 명령을 시작 파일 중 하나에 추가해 두면, 이후 ls 명령을 실행할 때마다 자동으로 ls --color=tty 명령으로 대체되어 실행됩니다.

export 명령은 환경 변수를 설정하는 데 사용됩니다. 다양한 환경 변수는 시스템이나 다른 애플리케이션에서 활용되며, 어떤 애플리케이션이나 스크립트든 읽을 수 있는 파라미터를 설정하는 방법입니다. 반면 export 없이 변수를 설정하면, 그 변수는 해당 프로세스 안에서만 존재하게 됩니다.

아래 예제는 HISTSIZE 환경 변수를 export 하는 모습입니다. #으로 시작하는 줄은 주석(comment)입니다.

$ cat /etc/profile
alias ls 'ls --color=tty'

# Setup some environment variables.
export HISTSIZE=1000

PATH=$PATH:$HOME/bin:/usr/bin:/bin/usr:/sbin/etc

export PATH

export SVN_SH=${SVN_RSH-ssh}