본문 바로가기
OS/Linux

쉘 스크립트 기초 개념 및 활용 정리

by Mostlove 2025. 3. 21.
728x90
반응형

쉘 스크립트 개념 및 주요 기능 정리 📜


🔢 변수 수식 계산

쉘에서 변수끼리 연산하려면 expr 또는 bc를 사용해야 함.

  • 연산 기호 전후에 공백 필수
  • *는 와일드카드와 겹치므로 \*로 사용 (최신 버전에서는 그냥 * 사용 가능)
  • 괄호도 \( \) 형태로 사용해야 함
a=10
b=5
sum=$(expr $a + $b)  # 덧셈
mul=$(expr $a \* $b) # 곱셈 (와일드카드 방지)
div=$(echo "$a / $b" | bc) # bc 사용한 나눗셈

📌 실습 예제:
Kor, Eng, Math 성적을 입력받아 합과 평균을 계산하는 스크립트 작성.


📌 파라미터 변수

쉘 스크립트 실행 시 외부에서 전달된 인자를 받는 변수.

  • $0: 스크립트 파일명
  • $1, $2, $3...: 전달된 인자 값
  • $*: 모든 인자 출력
  • $#: 인자의 개수 출력
echo "Script Name: $0"
echo "First Argument: $1"
echo "All Arguments: $*"
echo "Total Arguments: $#"

🔐 로그인 정보 확인

  • 로그인 성공: last 명령어 (/var/log/wtmp 파일 기록)
  • 로그인 실패: lastb 명령어 (/var/log/btmp 파일 기록)
  • 현재 로그인 사용자 정보: w 명령어 (/var/run/utmp 파일 기록)

⚠️ strings 명령어로 파일 내용을 읽어야 함.

strings /var/log/wtmp | tail -5

⚖️ BMI 계산

BMI = 체중(kg) / (키(m)²)

echo "Enter height (cm): "
read height
echo "Enter weight (kg): "
read weight

bmi=$(echo "scale=2; $weight / (($height / 100) ^ 2)" | bc)
echo "Your BMI is $bmi"

if (( $(echo "$bmi < 18" | bc -l) )); then
  echo "저체중"
elif (( $(echo "$bmi >= 18 && $bmi < 23" | bc -l) )); then
  echo "정상"
elif (( $(echo "$bmi >= 23 && $bmi < 25" | bc -l) )); then
  echo "과체중"
else
  echo "비만"
fi

🎯 상수 (Constant)

  • readonly 변수명=값
  • declare -r 변수명=값
readonly PI=3.14
declare -r MAX_USERS=100

📦 배열 (Array)

배열 선언 및 접근 방법:

arr=("apple" "banana" "cherry")
echo ${arr[0]}  # 첫 번째 요소
echo ${arr[@]}  # 모든 요소 출력
echo ${#arr[@]} # 배열 길이

📌 연속된 숫자 배열 생성

seq 1 5  # 1부터 5까지 출력

📝 주석 (Comment)

  • 한 줄 주석: #
  • 여러 줄 주석:
: << 'END'
여러 줄 주석 처리
END

🏗️ 조건문 (if ~ else)

if [ 조건 ]; then
  실행문
elif [ 다른 조건 ]; then
  실행문
else
  실행문
fi

📌 파일 체크 조건

조건 설명
-d 디렉터리 존재 여부
-f 파일 존재 여부
-r 읽기 가능 여부
-w 쓰기 가능 여부
-x 실행 가능 여부

📌 숫자 비교 연산자

연산자 설명
-eq 같음
-ne 다름
-gt 초과
-lt 미만
-ge 이상
-le 이하

📌 문자열 비교

if [ "$str1" == "$str2" ]; then
  echo "같음"
fi

📌 논리 연산자

연산자 설명
&& AND 연산
`  

🎭 case 문

case "$변수" in
  "값1") 실행문 ;;
  "값2") 실행문 ;;
  *) 기본 실행문 ;;
esac

🔄 반복문 (Loops)

🔹 for 문

for i in {1..5}; do
  echo $i
done

📌 C 스타일 for 문:

for ((i=1; i<=5; i++)); do
  echo $i
done

🔹 while 문

while [ 조건 ]; do
  실행문
done

🔹 until 문

until [ 조건 ]; do
  실행문
done

🎛️ 제어문 (break, continue, exit)

명령어 설명

break 반복문 탈출
continue 다음 루프로 건너뜀
exit 스크립트 종료
return 함수에서 값 반환
for i in {1..10}; do
  if [ $i -eq 5 ]; then
    break
  fi
  echo $i
done

🏷️ select 문 (메뉴 만들기)

select option in "Option 1" "Option 2" "Quit"; do
  case $option in
    "Option 1") echo "선택: 1" ;;
    "Option 2") echo "선택: 2" ;;
    "Quit") break ;;
    *) echo "잘못된 입력" ;;
  esac
done

📝 쉘 스크립트에서 함수, 라이브러리, eval, export, Python 실행


1. 함수(Function)

함수는 특정 작업을 수행하는 코드 블록으로, 내장 함수(add(), sum() 등)와 사용자가 직접 작성하는 사용자 정의 함수로 나뉜다.
쉘에서는 변수를 선언하지 않고 사용할 수 있듯이, 함수도 미리 선언할 필요 없이 바로 만들고 호출하여 사용할 수 있다.

함수의 기본 형식

(function) 함수_명(인자1, 인자2, ...) {  # 함수 정의
  실행문  # 함수 몸체
}
함수_명(인자)  # 함수 호출

👉 함수 호출 시 함수명은 정의된 이름과 동일해야 하며, 인자의 개수만 맞으면 인자 이름은 자유롭게 설정 가능

📌 예제 1: 간단한 함수 선언 및 호출

function greet() {
    echo "안녕하세요!"
}
greet  # 함수 호출

출력 결과

안녕하세요!

📌 예제 2: 인자를 사용하는 함수

function add_numbers() {
    sum=$(( $1 + $2 ))  # 첫 번째, 두 번째 인자를 더함
    echo "합계: $sum"
}
add_numbers 10 20  # 함수 호출 (10과 20을 인자로 전달)

출력 결과

합계: 30

📌 예제 3: 반환값이 있는 함수

function multiply() {
    echo $(( $1 * $2 ))
}
result=$(multiply 5 3)  # 결과값을 변수에 저장
echo "결과: $result"

출력 결과

결과: 15

2. Shell Library (쉘 라이브러리)

라이브러리는 자주 사용하는 함수들을 모아둔 파일이다. 단독으로 실행되는 것이 아니라, 다른 스크립트에서 불러와서 사용한다.

📌 라이브러리 예제

📌 my_library.sh (라이브러리 파일)

#!/bin/bash
function say_hello() {
    echo "Hello, $1!"
}

📌 main_script.sh (라이브러리 호출)

#!/bin/bash
source my_library.sh  # 라이브러리 파일 불러오기

say_hello "Jinwon"  # 라이브러리 내 함수 사용

출력 결과

Hello, Jinwon!

3. eval (문자열을 명령어로 실행)

eval은 문자열 형태의 명령어를 변수로 실행할 수 있도록 한다.

📌 예제 1: 변수에 저장된 명령어 실행

command="ls -l"
eval $command

📌 예제 2: 여러 개의 명령어 실행

commands="mkdir test_dir; cd test_dir; touch test_file"
eval $commands
ls test_dir

출력 결과

test_file

4. $(명령어) (명령어 실행 결과를 변수에 저장)

쉘에서 명령어 실행 결과를 변수에 저장하고 싶을 때 사용한다.
eval $(문자열)과 비슷한 효과가 있다.

📌 예제 1: 현재 디렉토리 파일 목록 저장

files=$(ls)
echo "파일 목록: $files"

📌 예제 2: 시스템 정보 가져오기

cpu_info=$(lscpu | grep "Model name")
echo "CPU 정보: $cpu_info"

5. export (환경 변수 전달)

export는 A 프로세스의 변수를 B 프로세스에서 사용할 수 있도록 전달하는 명령어이다.
부모 프로세스에서 설정한 환경 변수를 자식 프로세스가 사용할 수 있게 한다.

📌 예제 1: export를 이용한 환경 변수 전달

export MY_VAR="Hello, World!"
bash -c 'echo $MY_VAR'  # 새로운 프로세스에서 환경 변수 사용

출력 결과

Hello, World!

📌 예제 2: 쉘 스크립트에서 export 활용

#!/bin/bash
export GREETING="안녕하세요!"
./child_script.sh  # 다른 스크립트 실행

📌 child_script.sh

#!/bin/bash
echo $GREETING

출력 결과

안녕하세요!

📌 해킹 활용 예: 시스템 정보 추출 (보안적으로 위험)

해커가 침투한 시스템에서 export를 활용해 정보 탈취할 수도 있다.

export SYSTEM_INFO=$(uname -a)
bash -c 'echo $SYSTEM_INFO'  # 시스템 정보 출력

6. 쉘 스크립트에서 Python 실행

쉘 스크립트에서 Python 코드를 직접 실행할 수 있다.

📌 예제 1: Python 코드 실행

python3 -c 'print("Hello from Python!")'

출력 결과

Hello from Python!

📌 예제 2: 쉘 스크립트 내부에서 Python 코드 실행

#!/bin/bash
echo "쉘에서 Python 실행"

python3 <<EOF
print("Python 내부 코드 실행!")
for i in range(3):
    print("반복:", i)
EOF

출력 결과

쉘에서 Python 실행
Python 내부 코드 실행!
반복: 0
반복: 1
반복: 2

📌 예제 3: 환경 변수 사용하여 Python 실행

export NAME="Jinwon"
python3 -c 'import os; print("Hello,", os.getenv("NAME"))'

출력 결과

Hello, Jinwon

🔹 정리

개념 설명 예제

함수 특정 작업을 수행하는 코드 블록 function say_hello() { echo "Hello!" }
Shell Library 자주 사용하는 함수들을 모아둔 파일 source my_library.sh
eval 문자열을 명령어로 실행 eval "ls -l"
$(명령어) 명령어 실행 결과를 변수로 저장 files=$(ls)
export 환경 변수를 다른 프로세스로 전달 export MY_VAR="Hello"
쉘에서 Python 실행 Python 코드를 직접 실행 가능 python3 -c 'print("Hello")'

 

반응형

'OS > Linux' 카테고리의 다른 글

Web Server  (1) 2025.03.25
Linux Server Build  (0) 2025.03.24
쉘 스크립트 완벽 정리: 개념부터 활용  (0) 2025.03.20
Puppet  (0) 2025.03.20
GRUB 손상시 복구 방법  (0) 2025.03.20