Shell 스크립트는 쉘(shell)에서 실행되는 명령어들을 순차적으로 나열한 프로그래밍 스크립트입니다. 쉘은 사용자와 컴퓨터 시스템 간의 인터페이스로, 텍스트 기반의 명령어를 사용하여 시스템을 제어하고 작업을 수행할 수 있습니다. 대표적인 쉘로는 Bash, Zsh, Ksh, Csh 등이 있습니다.
Shell 스크립트는 주로 시스템 관리, 자동화, 배치 작업 등에 사용되며, 명령어들을 조합하여 복잡한 작업을 간단하게 처리할 수 있습니다. Shell 스크립트는 변수, 조건문, 반복문, 함수 등의 프로그래밍 요소를 포함할 수 있어 효율적인 작업 수행이 가능합니다.
Shell 스크립트는 텍스트 파일로 작성되며, 파일 확장자는 주로 .sh를 사용합니다. 스크립트를 실행하려면 실행 권한을 부여한 뒤 쉘 환경에서 해당 파일을 호출하면 됩니다.
#!/bin/bash
# 변수 설정
greeting="Hello, World!"
# 출력
echo $greeting
위 스크립트는 #!/bin/bash로 시작하여 해당 스크립트를 Bash 쉘에서 실행하도록 지정합니다. 스크립트는 greeting이라는 변수에 "Hello, World!" 문자열을 저장한 후, echo 명령어를 사용하여 해당 문자열을 출력합니다.
본 글에서는 가장 일반적으로 많이 사용되는 Bash shell 기본 문법에 대해서 알아보겠습니다.
1. 변수 (Variables): 변수는 = 기호를 사용해 값을 할당하며, 변수 이름 앞에 $ 기호를 붙여 사용합니다. 공백이 없어야 합니다.
예약변수
쉘 스크립트에서 사용자가 정해서 만들 수 없는 이미 정의된 변수가 존재합니다. 그것을 예약 변수라고 하는데요. 몇가지 예약 변수를 보도록 합시다.
변수 | 설명 |
HOME | 사용자 홈 디렉토리를 의미합니다. |
PATH | 실행 파일의 경로입니다. 여러분이 chmod, mkdir 등의 명령어들은 /bin이나 /usr/bin, /sbin에 위치하는데, 이 경로들을 PATH 지정하면 여러분들은 굳이 /bin/chmod를 입력하지 않고, chmod 입력만 해주면 됩니다. |
LANG | 프로그램 실행 시 지원되는 언어를 말합니다. |
UID | 사용자의 UID입니다. |
SHELL | 사용자가 로그인시 실행되는 쉘을 말합니다. |
USER | 사용자의 계정 이름을 말합니다. |
FUNCNAME | 현재 실행되고 있는 함수 이름을 말합니다. |
TERM | 로그인 터미널을 말합니다. |
2. 조건문 (Conditionals): if, elif, else, fi 키워드를 사용해 조건문을 작성합니다. 쉘스크립트의 case문은 여러 가지 선택 사항 중 하나를 선택하고 해당하는 작업을 수행할 때 사용됩니다.
number=10
if [ $number -lt 5 ]; then
echo "Number is less than 5."
elif [ $number -eq 5 ]; then
echo "Number is equal to 5."
else
echo "Number is greater than 5."
fi
파일 관련 조건
조건 | 설명 |
if [ -d ${변수} ]; then if [ ! -d ${변수} ]; then |
${변수}의 디렉토리가 존재하면 참이 성립합니다. ${변수}의 디렉토리가 존재하지 않으면 참이 성립합니다. |
if [ -e ${변수} ]; then if [ ! -e ${변수} ]; then |
${변수}라는 파일이 존재하면 참입니다. ${변수}라는 파일이 존재하지 않으면 참입니다. |
if [ -L ${변수} ]; then | 파일이 symbolic link이면 참입니다. |
if [ -s ${변수} ]; then | 파일의 크기가 0보다 크면 참입니다. |
if [ -S ${변수} ]; then | 파일 타입이 소켓이면 참입니다. |
if [ -r ${변수} ]; then | 파일을 읽을 수 있으면 참입니다. |
if [ -w ${변수} ]; then | 파일을 쓸 수 있으면 참입니다. |
if [ -x ${변수} ]; then | 파일을 실행할 수 있으면 참입니다. |
if [ -f ${변수} ]; then | 파일이 정규 파일이면 참입니다. |
if [ -c ${변수} ]; then | 파일이 문자 장치이면 참입니다. |
if [ ${변수1} -nt ${변수2}]; then | 변수1의 파일이 변수2의 파일보다 최신 파일이면 참입니다. |
if [ ${변수1} -ot ${변수2}]; then | 변수1의 파일이 변수2의 파일보다 최신이 아니면 참입니다. |
if [ ${변수1} -ef ${변수2}]; then | 변수1의 파일과 변수2의 파일이 동일하면 참입니다. |
case 변수 in
패턴1)
명령어1
;;
패턴2)
명령어2
;;
*)
기본 명령어
;;
esac
#!/bin/bash
echo "Enter a character:"
read character
case $character in
[A-Z])
echo "You entered an uppercase letter."
;;
[a-z])
echo "You entered a lowercase letter."
;;
[0-9])
echo "You entered a digit."
;;
*)
echo "You entered a special character."
;;
esac
3. 반복문 (Loops): for 루프와 while 루프를 사용할 수 있습니다.
for i in {1..5}; do
echo "Iteration: $i"
done
count=1
while [ $count -le 5 ]; do
echo "Iteration: $count"
count=$((count + 1))
done
4. 함수 (Functions): 코드의 재사용성을 높이기 위해 함수를 사용할 수 있습니다.
greet() {
echo "Hello, $1!"
}
greet "John"
5. 명령 실행 및 명령 치환 (Command Execution and Substitution): 명령을 실행하거나 명령 결과를 변수에 저장할 수 있습니다.
- 명령 실행 (Command Execution)
echo "Today is:"
date
- 명령 치환 (Command Substitution)
current_date=$(date)
echo "Today is: $current_date"
6. 명령 인수 (Command-line Arguments): 스크립트에 전달된 인수를 사용할 수 있으며, $0은 스크립트 이름, $1, $2, ... 은 순차적으로 인수를 나타냅니다.
#!/bin/bash
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
7. 배열 (Array) :쉘 스크립트에서 배열(Array)은 하나의 변수에 여러 값을 저장하는 방법입니다. 쉘 스크립트에서는 배열을 사용하여 데이터를 저장하고 순환하거나 다양한 연산을 수행할 수 있습니다.
array_name=(value1 value2 value3 ... valueN)
#!/bin/bash
# 배열 정의
fruits=(apple banana orange)
# 배열 요소 출력
echo ${fruits[0]} # 출력 결과: apple
echo ${fruits[1]} # 출력 결과: banana
echo ${fruits[2]} # 출력 결과: orange
# 배열의 모든 요소 출력
echo ${fruits[@]} # 출력 결과: apple banana orange
# 배열의 길이 출력
echo ${#fruits[@]} # 출력 결과: 3
host 파일에서 한 줄씩 읽어 ping 보내는 예제
#!/bin/bash
filename="ip_list.txt"
while read ip_or_domain; do
echo "Pinging $ip_or_domain:"
ping -c 4 "$ip_or_domain"
echo
done < "$filename"
scp 예제
#!/bin/bash
# 원본 파일 경로 및 파일명
SOURCE_FILE="/home/user/example.txt"
# 대상 서버 정보
DEST_SERVER="example.com"
DEST_USER="user"
DEST_DIR="/home/user/"
# scp 명령어 실행
scp $SOURCE_FILE $DEST_USER@$DEST_SERVER:$DEST_DIR