cmod.ify

[LINUX] Shell Programming(Script) 본문

BASIC/LINUX

[LINUX] Shell Programming(Script)

modifyC 2026. 1. 16. 19:29
728x90
반응형

1. 개요

  • 정의: Unix, Linux, POSIX(MacOS 포함) 환경에서 사용하는 명령어와 프로그래밍 요소(if, for 등)가 결합된 인터프리터 기반 스크립트 언어임.
  • 특징: 컴파일 과정 없이 한 줄씩 읽어 실행하며, 시스템 자동화 및 일괄 처리에 강력함.

2. 주요 쉘 종류

  • sh: 쉘 스크립트의 기본이 되는 본 쉘(Bourne Shell).
  • bash: 리눅스 표준 쉘. 본 쉘 기반에 C쉘과 코온 쉘의 기능을 통합함.
  • ksh: 유닉스에서 주로 사용되는 코온 쉘.
  • csh / tcsh: C언어와 유사한 문법을 가진 쉘.
  • zsh: bash, ksh, tcsh의 장점을 모아 개선한 확장 쉘. 최근 MacOS 기본 쉘로 채택됨.

3. 기본 문법 및 실행

생성 및 작성

  • 확장자는 .sh를 사용함.
  • 파일 첫 줄에 #!/bin/bash (쉬뱅, Shebang)를 작성하여 실행 쉘을 지정함.
 
#!/bin/bash
echo "hello world"

실행 방법

  1. 쉘을 통한 실행: 파일 읽기 권한만 있으면 됨.
    • bash myshell.sh 또는 sh myshell.sh
  2. 직접 실행: 실행 권한(x) 부여 후 경로를 지정해 실행함.
    • chmod 751 myshell.sh
    • ./myshell.sh (현재 디렉토리가 PATH에 없으므로 ./ 필수)

4. 변수와 함수

변수 선언 및 사용

  • 변수명=값 형태로 선언 (등호 앞뒤 공백 금지).
  • 사용 시에는 $변수명 또는 ${변수명} 사용.
 
#!/bin/bash
lang="Korean"
echo "I can speak $lang"

함수(Function)

  • function 이름() { 내용 } 형태로 정의함.
  • 파라미터는 $1, $2 등 위치 매개변수로 전달받음.
 
#!/bin/bash
function print(){
    echo $1
}
print "I can speak Korean"

5. 변수 종류 및 매개변수

변수 범위

  • 전역변수: 스크립트 전체에서 사용 가능.
  • 지역변수: 함수 내부에서만 사용 가능.
  • 환경변수: 시스템에 예약된 변수 (HOME, PATH, PWD, USER, HOSTNAME 등).

위치 매개변수

  • $0: 실행된 스크립트 이름.
  • $1, $2: 전달된 인자(파라미터). 10번부터는 ${10} 사용.
  • $*: 모든 인자를 하나의 문자열로 취급.
  • $@: 모든 인자를 각각의 개별 문자열로 취급.
  • $#: 매개변수의 총 개수.

특수 매개변수

  • $$: 현재 프로세스의 PID.
  • $?: 최근 실행된 명령어의 종료 상태 (0은 성공, 이외는 에러).
  • $!: 최근 백그라운드에서 실행된 명령의 PID.
  • $-: 현재 설정된 쉘 옵션 플래그.

6. 매개변수 확장 및 치환

확장 변경자 (초기화 및 조건부 할당)

문법 설명
${var-val} 변수 미설정 시 val 사용
${var:-val} 변수 미설정 또는 null 시 val 사용
${var=val} 변수 미설정 시 val을 변수에 저장 후 사용
${var:?msg} 변수 미설정/null 시 에러 메시지 출력 후 종료
${var:시작:길이} 문자열 부분 추출

패턴 치환 및 제거

  • ${var#패턴}: 앞부분부터 짧게 일치하는 패턴 제거.
  • ${var##패턴}: 앞부분부터 길게 일치하는 패턴 제거.
  • ${var%패턴}: 뒷부분부터 짧게 일치하는 패턴 제거.
  • ${var%%패턴}: 뒷부분부터 길게 일치하는 패턴 제거.
  • ${var/패턴/변경}: 첫 번째 패턴 치환.
  • ${var//패턴/변경}: 모든 패턴 치환.
  • ${#var}: 문자열 길이 반환.

7. 활용 예시 (문자열 조작)

FILE_PATH="/etc/nova/nova.conf"

# 디렉토리 경로만 추출 (% 사용)
echo ${FILE_PATH%/*}   # 결과: /etc/nova

# 파일 이름만 추출 (## 사용)
echo ${FILE_PATH##*/}  # 결과: nova.conf

# 문자열 치환
OS_TYPE="Redhat Linux Ubuntu Linux"
echo ${OS_TYPE//Linux/OS}  # 결과: Redhat OS Ubuntu OS

 

 

8. 조건문 (if, case)

1) if문

  • 기본 형식: if, then, elif, else, fi 구조를 가짐.
  • 특이사항: 조건식 [ ] 사이에는 반드시 공백이 있어야 함.
var1=10; var2=20
if [ $var1 = $var2 ]
then
  echo "True"
else
  echo "False"
fi

# 문자열 길이 체크 (-z: zero)
value=""
if [ -z $value ]; then
  echo "문자열이 비어있음"
fi

2) case문

  • 기본 형식: 특정 변수의 값에 따라 다른 명령을 수행하며, esac로 종료함.
  • 패턴: 각 조건 끝에는 )를 붙이고, 실행문 끝에는 ;;를 붙임. *는 나머지 모든 경우(default)를 의미함.
case $1 in
  start)
    echo "서비스 시작" ;;
  restart)
    echo "서비스 재시작" ;;
  *)
    echo "사용법: $0 {start|restart}" ;;
esac

9. 반복문 (for, while)

1) for문

  • 리스트 기반: 리스트나 배열의 요소를 하나씩 꺼내어 반복함.
  • 범위 지정: {시작..끝} 문법을 통해 숫자 범위를 지정할 수 있음
# 기본 리스트
for num in 1 2 3; do echo $num; done

# 숫자 범위 {1..5}
for num in {1..5}; do echo $num; done

# 배열 사용
array=("apple" "banana")
for fruit in ${array[@]}; do echo $fruit; done

# C언어 스타일
for ((num=0; num<3; num++)); do echo $num; done

2) while문

  • 조건 기반: 조건식이 참(True)인 동안 계속해서 반복 수행함.
num=0
while [ $num -lt 3 ]
do
  echo $num
  num=$((num+1)) # 증감 연산
done

10. 연산자 정리

숫자 비교 연산자

연산자 의미 비고
-eq 같음 (equal) [ $a -eq $b ]
-ne 같지 않음 (not equal)  
-gt 크다 (greater than)  
-lt 작다 (less than)  
-ge 크거나 같다 (greater or equal)  
-le 작거나 같다 (less or equal)  

문자열 및 논리 연산자

  • 문자열: -z(길이 0), -n(길이 0 아님), =, !=, <, >
  • 논리: -a(AND), -o(OR) / &&, ||
    • [ ] 안에서는 -a, -o 사용.
    • &&, ||를 쓸 때는 [[ ]]를 쓰거나 [ ] && [ ] 형태로 연결함.

파일 및 디렉토리 연산자

  • 유형 확인: -d(디렉토리), -f(일반 파일), -L(심볼릭 링크)
  • 권한 및 상태: -r(읽기), -w(쓰기), -x(실행), -s(크기가 0보다 큼)
  • 소유권: -O(소유자 일치), -G(그룹 일치)

파일 비교 연산자

  • 파일1 -nt 파일2: 파일1이 파일2보다 최신(newer than)이면 참.
  • 파일1 -ot 파일2: 파일1이 파일2보다 오래된(older than) 것이면 참.
  • 파일1 -ef 파일2: 두 파일이 동일한 파일(equal file, 하드 링크 등)이면 참.
# 실습 예시: 심볼릭 링크와 파일 크기 체크
FILE="/etc/localtime"
if [ -L $FILE ]; then
  echo "이것은 심볼릭 링크입니다."
fi

touch sample.txt
if [ -s sample.txt ]; then
  echo "내용이 있는 파일입니다."
else
  echo "빈 파일입니다."
fi

 


11. 정규 표현식 (Regular Expression)

1) 개요

  • 정의: 리눅스나 유닉스 환경에서 텍스트 검색 및 추출에 특별한 의미를 부여하는 문자들과 메타 문자들의 집합임.
  • 장점: 방대한 텍스트 파일 내에서 특정 패턴을 빠르게 찾고 편집할 때 매우 효율적임.

2) 주요 메타 문자 (Meta Characters)

문자 설명
. 줄바꿈을 제외한 임의의 한 문자
? 앞의 문자가 0번 또는 1번 나타남
* 앞의 문자가 0번 이상 반복
+ 앞의 문자가 1번 이상 반복 (반드시 하나 이상)
{N} 정확히 N번 반복
{N,} N번 이상 반복
{N, M} N번 이상 M번 이하 반복
^ 라인의 시작을 의미 (목록 안 [^ ]에선 부정의 의미)
$ 라인의 끝을 의미
^$ 빈 줄(공백 라인) 의미
[ ] 문자들의 집합 중 하나와 일치
\ 특수 문자를 일반 문자로 해석 (Escape)

3) 문자 클래스 (Character Classes)

grep 등에서 사용할 때는 [[:클래스명:]] 형태로 사용함.

  • [:alnum:]: 알파벳과 숫자
  • [:alpha:]: 알파벳
  • [:digit:]: 숫자 (0-9)
  • [:lower:] / [:upper:]: 소문자 / 대문자
  • [:space:]: 공백(스페이스, 탭, 줄바꿈 등)
  • [:punct:]: 문장 부호(구두점)

12. 정규 표현식 실습 (grep 활용)

실습 파일(expression.txt)을 대상으로 다양한 패턴 검색을 수행함. 확장 메타 문자나 클래스 사용 시 -E (Extended regexp) 옵션을 사용하는 것이 좋음.

주요 실습 예제

1. C로 시작하고 U로 끝나는 3글자 조회

grep 'C.U' expression.txt
# 결과: CPU model is Intel(R)...

2. q로 시작해서 ?로 끝나는 단어 (중간에 소문자만 존재)

  • ?는 메타 문자이므로 일반 문자로 인식시키기 위해 \를 붙임.
grep -E 'q[[:lower:]]*\?' expression.txt
# 결과: Do you have any questions?

3. '-' 뒤에 숫자 '2'가 1번 이상 나오고 다시 '-'가 나오는 패턴

grep -E '\-2+\-' expression.txt
# 결과: phone: 010-2222-5668

4. 라인 시작이 알파벳 5글자이고 바로 뒤에 ':'이 오는 경우

grep -E '^[[:alpha:]]{5}:' expression.txt
# 결과: phone: 010-2222-5668

5. 라인 시작이 알파벳 5글자 이상이고 뒤에 공백이 오는 경우

grep -E '^[[:alpha:]]{5,}[[:space:]]' expression.txt
# 결과: Today is..., Current..., Memory...

13. 스크립트에서 많이 사용하는 명령어

1) grep (텍스트 검색)

  • 개요: 파일 내에서 특정 패턴을 가진 문자열을 조회할 때 사용함.
  • 형식: grep [옵션] 패턴 [파일경로]
  • 주요 옵션:
    • -E: 확장 정규 표현식 사용.
    • -e: 여러 개의 정규 표현식을 동시에 사용할 때 유용함 (-e 패턴1 -e 패턴2).
    • -f: 패턴을 파일에서 읽어옴.
    • -F: 패턴을 정규 표현식이 아닌 단순 문자열로 처리함.

2) find (파일 찾기)

  • 개요: 특정 조건(이름, 권한, 시간 등)에 맞는 파일을 디렉토리 트리에서 검색함.
  • 사용 예시:
    • 이름으로 검색: find /etc -name chrony.conf
    • 권한이나 시간 검색: 특정 접근 권한이나 수정 시간을 기준으로 정교한 검색이 가능함.

3) awk (데이터 추출 및 리포팅)

  • 개요: 텍스트를 필드(열) 단위로 나누어 처리하는 강력한 도구임.
  • 특징: CSV 파일처럼 구분자로 나누어진 데이터에서 특정 열($1, $2 등)만 추출할 때 주로 쓰임.

4) sed (스트림 에디터)

  • 개요: 파일을 열지 않고도 텍스트를 검색, 교체, 삭제할 수 있는 편집기임.
  • 치환 예시: sed 's/찾을문자열/바꿀문자열/' 파일명
    • #PermitRoot를 찾아 주석(#)을 제거하는 설정 자동화에 많이 활용됨.
    # 주석 해제 후 결과 확인
    sed 's/#PermitRoot/PermitRoot/' /etc/ssh/sshd_config | grep '^PermitRoot'
    

5) date (날짜 및 시간)

  • 개요: 시스템의 현재 날짜와 시간을 출력하거나 설정함.
  • 형식: date +포맷
  • 자주 쓰는 표현:
    • date -d yesterday: 어제 날짜 출력.
    • date '+%Y-%m-%d %I:%M %p': 연-월-일 시:분 오전/오후 형식으로 출력.

14. 쉘 스크립트 작성 팁

  • 파이프라인(|) 활용: 앞선 명령어의 결과(stdout)를 다음 명령어의 입력(stdin)으로 바로 넘겨 처리 효율을 높임.
  • 디버깅: 스크립트 실행 시 bash -x 스크립트명을 사용하면 실행 과정을 한 줄씩 추적할 수 있음.

 

 

728x90
반응형