카테고리 없음

[Linux] Shell script 기초

openDeveloper 2023. 4. 9. 23:49

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