글 목록으로 돌아가기

Linux

쉘 프로그래밍

Linux bash 쉘 스크립트 변수, 함수, 조건문, 반복문, 정규표현식 정리

Dohyeon Kim
Dohyeon Kim 2026년 7월 29일 · 7분 읽기
Linux AutoEverSW

1 ) 개요


Shell Script

  • Unix / Linux 또는 POSIX(Portable Operation SYstem Interface)를 지원하는 운영체제인 Mac OS 등에서 일반적으로 사용되는 명령어들과 if 나 for 같은 프로그래밍적인 요소로 이뤄진 인터프리터 기반의 스크립트 언어
  • Linux나 Unix가 설치 돼 있으면 어디서든 실행 가능

  • 일반적인 언어와 비슷함
    • 변수
    • 반복문
    • 제어문 등

작성

  • 확장자는 생략 또는 직접 정할 수 있으나 관례상 .sh를 사용
  • 파일 내부에서는 상단에 #!/bin/bash 형태로 shebang을 작성 → Script 파일인 것을 명시

실행

  • sh 명령으로 실행 → sh {dirPath}
  • 실행 가능한 속성으로 변경해서 실행
  • 스크립트를 만들지 않고 실행
    • echo “이름: “ “$UESR; echo “홈: “ $HOME

2 ) 변수


개요

  • 변수를 사용하기 전 미리 선언할 필요 없음
  • 처음 변수에 값을 할당 시 자동으로 변수 생성
  • 변수 이름은 대소문자 구분
    • 대문자로 사용하는 경우가 많음(명령어와 혼동 방지)
  • 변수에 값을 대입할 때 = 다음에 공백을 두면 안 됨
  • 변수 타입은 필요하지 않음
  • 문자열 사이 공백이 있을 때
    • " "로 묶어야 함 (명령어와 혼동 방지)

      변수 선언

  • 변수 사용 시 $를 붙여야 함
  • 변수 출력 → echo

    산술 연산

  • 변수에 넣은 값은 모두 문자열로 취급
  • 산술 연산 수행 시 expr 키워드를 사용해야 하며
  • `(백틱) 으로 묶어줘야 함
  • 수식에 괄호를 사용하고자 하는 경우 앞에 \ 추가
  • 곱셈(*)은 앞에 \ 추가 ![[Pasted image 20260729120710.png]]

    위치 매개변수

  • ${num} 형태를 가짐
  • ex) sh variable.sh -a --b
    • $0 → vatiable.sh
    • $1 → -a
    • $2 → –b
  • $* → 전체 인자를 의미, -a --b
  • $@ → 전체 인자를 의미, ""로 변수를 감싸면 다른 결과
  • $# → 매개변수의 총 개수
    echo "실행 파일 이름: <$0>"
    echo "fist param: <$1> second param: <$2>"
    echo "whole param: <$*> number of params: <$#>"
    

2 ) 함수


개요

  • 특정 동작이나 목적을 위해 만들어진 코드의 묶음
  • 사용하는 이유 → 코드의 재사용
  • function 이라는 단어로 시작
    • 함수 이름을 설정한 후 ( ) 를 작성, { }에 내용 작성

문자열 출력해주는 함수 활용

./func.sh

#!/bin/bash

function print() {
	echo "hello world"
}

print

→ 함수는 sh func.sh 시 에러 발생 → bash 명령으로 실행 권한 부여 후 ./func.sh는 실행 가능

매개변수를 이용한 함수

  • 위치로 변수를 매핑함
  • ( )를 이용한 파라피터로 사용하지 않음
./func.sh

#!/bin/bash

function print() {
	echo $1$
}

print

전역 변수와 지역 변수

  • 전역 변수
    • 함수 외부에서 생성해 모든 곳에서 사용 가능
  • 지역 변수
    • 함수 내부에서 local이라는 단어와 함께 생성
    • 함수 내부에서만 사용 가능
#!/bin/bash

glovalVar="전역변수"

function print() {
	echo globalVar
	local localVar="지역변수"
	echo $localVar
}
print

echo globalVar
echo $localVar

특수 매개변수

  • 현재 실행 중인 스크립트나 명령어의 프로세스 ID를 확인 가능
  • 앞에서 실행한 명령어나 함수 또는 스크립트 실행이 정상 실행됐는지 확인 가능
  • SS → 현재 스크립트 또는 명령어의 PID
  • S? → 최근에 실행된 명령어나 함수, 스크립트의 종료 상태
  • S! → 최근에 실행된 백그라운드의 PID
  • S- → 현재 옵션 플래그

    변수 확장

  • 변수와 문자열을 연속하여 사용할 때는 변수를 { }로 감싸야 함
  • 변수 초기화를 위한 확장 변경자
    • 헷갈려서 안 적음

변수 확장 상세

값이 없는 경우 치환을 위한 확장자

  • :을 생략하고 ${var-default}처럼 사용하면 변수가 선언되어 있으나 빈 문자열("")일 때는 값이 있는 상태로 취급
  • :을 붙이면 값이 없는 것으로 취급
확장 변수가 존재하지 않는 경우 변수가 존재하는 경우
${var:-default} 변수를 유지하면서 default 반환 원래 변수값 반환
${var:=default} 변수를 변경하고 default 반환 원래 변수값 반환
${var:?message} message 출력 후 스크립트 종료 원래 변수값 반환
${var:+alternative} 아무것도 반환하지 않음 alternative 값 반환

문자열 추출 및 길이 확인

  • var="HelloBash"
  • ${#var}: 문자열의 길이 → 9
  • ${var:offset}: 첫 번째 글자부터 offset까지 잘라냄 → ${var:5}"Bash"
  • ${var:offset:length}: offset 위치부터 length만큼 잘라냄 → ${var:0:5}"Hello"
  • ${var:-length}: 뒤에서부터 length만큼 잘라냄 → ${var: -4}"Bash"

패턴 삭제 및 파일 경로 추출

  • 특정 문자열이나 패턴을 매칭해서 삭제 → 파일 이름이나 확장자 추출에 유용
  • var="/home/user/test.txt"
${var#pattern}     # 앞에서부터 패턴과 가장 처음 일치하는 부분까지 삭제
${var#*/}          # → home/user/test.txt

${var##pattern}    # 앞에서부터 패턴과 가장 늦게 일치하는 부분까지 삭제
${var##*/}         # → test.txt

${var%pattern}     # 뒷부분부터 패턴과 가장 처음 일치하는 부분 제거 (확장자 제거)
${var%.*}          # → /home/user/test

치환 및 대소문자 변환

  • var="apple_pie"
${var/pattern/string}    # pattern과 처음 일치하는 부분을 string으로 변환
${var/apple/banana}      # → banana_pie

${var//pattern/string}   # pattern과 일치하는 부분 전부를 string으로 변환
${var//_/ }              # → apple pie

${var^}                  # 첫 글자만 대문자로 변환
${var^}                  # → Apple_pie

${var^^}                 # 모두 대문자로 변환
${var^^}                 # → APPLE_PIE

${var,}                  # 첫 글자만 소문자로 변환
${var,}                  # → aPPLE_PIE

${var,,}                 # 모두 소문자로 변환
${var,,}                 # → apple_pie

4) 조건문


if

if [ 첫번째 조건식 ]
then
    수행할 내용
elif [ 두번째 조건식 ]
then
    수행할 내용
...
else
    수행할 내용
fi
  • [ ]와 조건식 사이는 공백이 있어야 함

switch-case

case $변in
    값1)
        수행문1;;
    값2)
        수행문2;;
    값3)
        수행문3;;
    *)
        수행문
esac

5) 반복문


for ~ in

for 변수 in [ 리스트, 배열, 묶음 등 ]
do
    수행할 내용
done

for ((;;))

for ((변수=초기값; 조건식; 증감값))
do
    수행할 내용
done

while

while [ $변수 연산자 $변]
do
    수행할 문장
done

기타 제어문

  • until: 조건이 참이 될 때까지 반복
  • break: 반복문 종료
  • continue: 다음 반복으로 이동
  • return: 함수 종료
  • exit: 프로그램 종료

6) 연산자


문자열 연산자

  • -z: 문자열의 길이가 0이면
  • -n: 문자열의 길이가 0이 아니면

크기 비교 연산자

정수 비교

연산자 의미
-eq 같음
-ne 같지 않음
-gt
-ge 크거나 같음
-lt 작음
-le 작거나 같음
  • >, >=, <, <=를 사용할 때는 (( ))를 이용

문자열 비교

  • =, ==, !=
  • >, <를 사용할 때는 [[ ]]를 이용

and와 or 연산

and

[ 조건식 -a 조건식 ]
[ 조건식 ] && [ 조건식 ]
[[ 조건식 && 조건식 ]]

or

[ 조건식 -o 조건식 ]
[ 조건식 ] || [ 조건식 ]
[[ 조건식 || 조건식 ]]

파일 및 디렉토리 관련 연산

연산자 의미
-d 디렉토리이면 참
-e 파일이 존재하면 참
-f 파일이면 참
-L 파일이면서 심볼릭 링크이면 참
-g set-group-id 설정
-u set-user-id 설정
-r 읽기 가능
-w 쓰기 가능
-x 실행 가능
-s 크기가 0보다 크면 참
-O 실행 소유자와 동일한 소유자
-G 동일한 그룹

파일 비교 연산자

  • -nt: 앞의 파일이 더 최신 파일이면 참
  • -ot: 앞의 파일이 더 오래된 파일이면 참
  • -ef: 두 파일이 동일한 파일이면 참

7) Maker Function: 제공하는 함수


eval

  • 문자열을 명령문으로 인식해서 명령을 수행

export

  • 외부 변수로 만들어주는 함수
  • export로 변수를 선언하면 다른 파일에서 변수 사용 가능

printf

  • C언어의 printf 함수와 동일

set

  • 리눅스 명령의 결과를 파라미터로 사용하고자 할 때 이용
set $(date)   # 현재 날짜 및 시간을 파라미터로 활용
echo "$1"     # 날짜에서 첫 번째 데이터 출력

8) 정규 표현식


개요

  • 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어
  • 많은 양의 텍스트에서 필요한 문자열을 추출하거나 치환하기 위해 사용
  • 패턴을 기술하는 문자열 내의 각 문자들은 메타 문자정규 문자로 이해됨

일치 및 위치 지정 메타 문자

메타 문자 설명
. 하나의 문자
^ 문자열의 시작 → ^Hello: 대문자 H로 시작
$ 문자열의 끝 → bye$: bye로 끝남
| OR → apple\|banana: apple 또는 banana
* 0번 이상 반복 → lo*v: l + o가 0번 이상 + v
+ 1번 이상 반복 → lo+v: l + o가 1번 이상 + v
? 0번 또는 1번
{숫자} 정확히 숫자만큼
{숫자,} 숫자 이상 반복
{숫자1,숫자2} 최소 숫자1번, 최대 숫자2번

문자열 묶음 및 범위 한정

표현 의미
[abc] a, b, c 중 하나
[a-z] 소문자
[a-zA-Z] 영문자
[^0-9] 숫자가 아닌 문자

기타

  • \: 특수문자를 원래의 문자 의미대로 해석 (\??)
  • \b: 단어 끝의 공백
  • \B: 라인 끝의 공백
  • \<: 단어 시작에서 공백

문자 클래스

[:digit:] 숫자, [0-9] 또는 \d
[:lower:] 알파벳 소문자, [a-z]
[:upper:] 알파벳 대문자, [A-Z]
[:alpha:] 알파벳, [a-zA-Z]
[:xdigit:] 16진수 숫자
[:space:] 공백문자(space, tab, 줄바꿈 등)
[:blank:] Space, Tab (줄 바꿈 제외)
[:punct:] 문장 부호 및 특수 문자
[:print:] 출력 가능한 모든 문자(공백 포함)
[:graph:] 공백 제외 눈에 보이는 모든 문자
[:cntrl:] 제어 문자

Practice

https://ggangpae1.tistory.com/838 의 expression.txt

====================
 Regular Expression
====================
  
#===========================================#
# Date: 2020-05-05
# Author: NaleeJang
# Description: regular expression test file
#===========================================#


Today is 05-May-2020.
Current time is 6:04PM.
This is an example file for testing regular expressions.	This example file includes control characters.

# System Information
CPU model is Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz
Memory size is 32GiB
Disk is 512 GB
IP Address is 192.168.35.7

# Help
Do you have any questions? or Do you need any help?
If you have any questions, Please send a mail to the email below.

# Contacts
e-mail: nalee999@gmail.com
phone: 010-2222-5668
  1. 위의 expression.txt 를 scp로 서버에 전송

  2. C로 시작해 U로 끝나는 3글자grep C.U expression.txtCPU model is Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz

  3. C로 시작해 e로 끝나는 4글자 → grep C..e expression.txt → CPU model is Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz

  4. q로 시작해 ?로 끝나는 단어이며 영소문자가 개수에 상관 없이 중간에 존재하는 것을 검색 → grep q[[:lower:]]*\? expression.txt → Do you have any questions? or Do you need any help?

  5. - 다음 숫자 2가 1번 이상 반복, -로 끝나는 단어 검색 → grep -E '\-2+\-' expression.txt (특수문자가 있어 -E와 Single Quote로 묶어줌) → 010-2222-5668

  6. #으로 시작하는 단어 검색 → grep -E '^#' expression.txt

  7. 영문 5글자 뒤 :이 오는 단어 검색 → grep -E '^#' expression.txt

  8. 영문 5글자 뒤 공백을 가진 단어 검색 → grep -E '^[a-zA-z]{5}[[:space:]]' expression.txt

  9. 영문 4글자 이상 6글자 이하로 끝나는 단어 검색 → grep -E '^[a-zA-z]{5}[[:space:]]' expression.txt

  10. 숫자 4글자 이상 6글자 이하와 .으로 끝나는 단어 검색 → grep -E '[[:digit:]]' expression.txt → 이거 수정필요

댓글