Shell Programming
스크립트 실행
- 셸 스크립트 파일경로: sh 파일 경로를 주면 되는데(dash shell(sh)을 가지고 실행) bash와의 문법 차이때문에 실행이 안되는 경우가 있어서 이 경우에는 bash 파일 경로를 입력해야 한다.
- 스크립트 파일 경로: 파일에 실행 권한이 있어야 하고 파일이 PATH 경로에 있지 않은 경우에는 현재 디렉토리라도 ./를 추가해서 실행
연산자
-문자열 연산자
- -z: 문자열의 길이가 0인 경우 참 → 인자가 없으면 참
- -n: 문자열의 길이가 0이 아닌 경우 참 → 인자가 있어야 참
#!/bin/bash
if [ -z $1 ]
then
echo True
else
echo False
fi

-정수 비교 연산자
- -eq
- -ne
- -gt
- -ge
- -lt
- -le
- , >=, <, <=, ==, !=
- 크기 비교 연산자는 문자열에도 사용 가능한데 이 때는 기호를 사용해야 한다.
- → eq, gt, ge 등이 있어도 >, <= 기호가 있는 이유
- 기호를 사용해서 비교할 때는 [[ 처럼 대괄호를 하나 추가한다.

→ 대괄호를 하나 덜 쓰면 잘못된 값이 나온다!
-논리 연산자
- -a, &&(기호니까 대괄호 추가)
- -o, ||(기호니까 대괄호 추가)


-디렉토리 연산자
- -d: 변수 유형이 디렉토리이면 참
- -e: 변수 유형이 디렉토리이거나 파일이면 참

-파일 연산자
- -f: 유형이 파일이면 참
- -L: 파일이면서 심볼릭 링크이면 참
- -r: 읽기 권한이 있으면 참
- -w: 쓰기 권한이 있으면 참
- -x: 실행 권한이 있으면 참
- -s: 파일이나 디렉토리이면서 사이즈가 0보다 크면 참
- -O: 파일이나 디렉토리이면서 스크립트 실행 소유자와 동일하면 참
- -G: 파일이나 디렉토리이면서 스크립트 실행 그룹과 동일하면 참
- ex. /etc/localtime 과 /usr/share/zoneinfo/Asia/Seoul 파일을 확인

-파일 비교 연산자
- -nt: 변수 유형이 파일이면서 변수1이 변수2보다 최신 파일이면 참
- -ot: 변수 유형이 파일이면서 변수1이 변수2보다 이전 파일이면 참
- -ef: 변수 유형이 파일이면서 변수1이 변수2과 동일한 파일이면 참
- 실습
- first.txt, second.txt 파일 만들기
- third.txt를 first.txt의 심볼릭 링크로 만들기
- third.txt가 심볼릭 링크인지 확인하기
- 만든 파일들을 각각 FILE1, 2, 3의 변수에 넣어주기
- FILE1이 FILE2보다 최신인지 확인하기
- FILE1이 FILE2보다 더 먼저 만들어졌는지 확인하기
- FILE1과 FILE2가 똑같은 파일인지 확인하기
- FILE1과 FILE3이 똑같은 파일인지 확인하기 (FILE3은 FILE1의 심볼릭 링크니까 똑같은 파일이라고 볼 수 있다.)
- 실습

정규 표현식
텍스트 탐색과 문자열 조작에 사용되며 하나의 문자와 일치하거나 문자열의 일부분이나 전체 문자열 중 특정 문자 집합을 나타낼 때 사용
-POSIX 기본 및 확장 문법
- . (점): 줄바꿈을 제외한 한 개의 문자와 일치
- ?: 자신 앞에 나오는 정규 표현식이 없거나 하나와 일치하며 대부분 한 개의 문자와 매칭할 때 사용
- *: 한 번 이상 반복되는 문자
- +: *은 생략될 수 있지만 +는 반드시 한 번 이상 나와야 한다.
- {N}: 정확히 N번
- {N,}: N번 이상
- {N, M}: N에서 M번 일치
- -: 범위, A-Z는 A부터 Z까지
- ^: 라인의 시작에서는 공백문자를 의미하고 목록의 경우는 목록에 없는 글자
- $: 라인의 마지막 공백 문자열
- ^$: 빈 줄
- [..]: 문자들의 집합
- \: 특수 문자를 원래의 문자로 해석
- \b: 단어 끝의 공백 문자
- \B: 라인 끝의 공백 문자
- \<: 단어의 시작에서 공백
- \>: 단어의 끝에서 공백
-POSIX 문자 클래스
- [:alnum] : 알파벳이나 숫자 [A-Za-z0-9]
- [:alpha:] : 알파벳 [A-Za-z]
- [:blank:] : 스페이스 바나 탭
- [:contl:] : 제어문자
- [:digit:] : 숫자 [0-9]
- [:graph:] : 출력 가능한 그래픽 문자로 ASCII 코드로 33~126
- [:lower:] : 소문자 [a-z]
- [:print:] : 출력 가능한 문자 32~126, 스페이스 바가 포함되어 있다.
- [:punct:] : 문장 부호
- [:space:] : 뉴라인 줄 바꿈, 스페이스, 탭
- [:upper:] : 대문자
- [:xdigit:] : 16진주 숫자와 문자 [0-9a-fA-F]
- 실습 - expression.txt 파일 만들기
====================== Regular Expression ====================== #=======================# # Date: 2025-05-28 # Author: Kyla # Description: regular expression test file # ======================# Today is 28-May-2025 Current time is 11:30 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.906GHz Memory size is 32GiB Disk is 512 GB IP Address is 192.168.200.11 #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: itstudy@kakao.com phone: 010-3333-3333
(참고) grep -E : -E는 확장 정규표현식을 사용하게 해준다.
→ C로 시작하고 U로 끝나는 세 글자를 검색
grep 'C.U' expression.txt
→ c로 시작하고 e로 끝나는 네 글자를 검색
grep 'c..e' expression.txt
→ q로 시작하고 ?로 끝나는 단어여야 하고 q와 ?사이에는 소문자만 존재하는 글자 검색 (?가 특수문자로 인식되지 않도록 \붙여주는 거 주의!)
grep -E 'q[[:lower:]]*\\?' expression.txt
→ #로 시작하는 단어 검색
grep -E '^#' expression.txt
→ 영문 5글자로 시작하고 마지막이 :인 단어 찾기
grep -E '^[[:alpha:]]{5}:' expression.txt
→ 라인을 종료할 때 알파벳 4글자 이상 6글자 이하인 단어가 포함된 라인
grep -E '[[:alpha:]]{4,6}' expression.txt
→ #으로 시작하고 공백인 라인을 제거하고 출력
cat expression.txt | grep -v '^#' | grep -v '^$'
→ .으로 끝나는 단어 찾기 (.도 와일드 카드 글자라는 거 잊지 말고 \넣어주자!)
grep '\\.\\b' expression.txt
#-> ip 빠르게 찾는 것으로 응용할 수 있다.
ip address show | grep '\\.'
→ C로 시작하는 단어가 있는 라인을 검색
grep '\\<C' expression.txt
→ n으로 끝나는 단어가 있는 라인을 검색
grep 'n\\>' expression.txt
→ 특수문자가 포함된 라인을 조회 (ex. 탭)
grep '[[:cntrl:]]' expression.txt
→ 인쇄 가능한 라인만 조회: 빈줄을 제외
grep '[[:graph:]]' expression.txt
→ 인쇄 가능한 라인만 조회: 스페이스만 존재하는 라인도 조회
grep '[[:print:]]' expression.txt
→ 알파벳 6글자 이상이고 문장 부호로 끝나는 단어가 있는 라인만 조회 (문장 부호 → . , ? ;)
grep -E '[[:alpha:]]{6,}[[:punct:]]' expression.txt








-> 정규 표현식으로 찾는 것은 AI에도 많이 사용된다.
많이 사용하는 리눅스 명령어
grep [옵션] 패턴 [파일]
문자열을 찾을 수 있는 명령어
- 옵션
- -i: 대소문자 구분 없이 조회
- ex. /etc/fstab 파일에서 uuid를 조회
grep -i 'uuid' /etc/fstab

- -e: 검색하고자 하는 패턴이 여러 개일 때
- ex. expression.txt 파일에서 대괄호가 앞뒤에 있는 문자열을 검색
grep -i -e "^\\[[[:alpha:]]*\\]' expression.txt

- -f: 패턴을 파일에 저장해두고 적용하고자 하는 경우
- -f 옵션을 여러 번 사용해서 여러 개의 패턴을 적용할 수 있다.
- 명령어 뒤의 |(파이프)
cat expression.txt | grep -i '^\\[apple

find [대상경로] [표현식]
파일을 검색하기 위한 명령어
- /etc 디렉토리에서 chrony.conf 파일을 조회
find /etc -name chrony.conf
awk 패턴 {액션}
파일 목록 같은 것을 출력한 후 이를 컬럼에 해당하는 문자열로 추출해주는 명령어
- 필드와 레코드를 가진 표 형식의 데이터를 추출할 때 매우 유용하다.
- 레코드가 $0가 되고 $1부터는 필드가 된다.
- ex. awkexe.txt 파일에서 탭으로 표를 만들고 특정 열만 출력
name phone birth gender score
reak 010-1111-1111 1870-12-31 M 100
sim 010-2222-2222 1789-05-15 F 80
nara 010-3333-3333 1687-11-10 M 78
yumi 010-4444-4444 1999-06-23 F 59
awk '{ print $1, $2 }' awkexe.txt

- 검색도 할 수 있다.
awk '/rea/' awkexe.txt

- 제목도 붙일 수 있다.
awk '{ print ("name: "$1, "," "phone: "$2) }' awkexe.txt

옵션
정보 관련 옵션
- --help: 도움말
- -V, --version: 버전
패턴 문법 관련 옵션
- -E: 확장 정규 표현식에 해당하는 패턴을 검색할 때 사용
- -F: 여러 줄로 되어 있는 문자열을 검색할 경우 사용
- -G: 기본 정규 표현식에 해당하는 패턴을 검색할 때 사용되는 옵션으로 기본값
- -P: Perl 방식의 정규 표현식에 해당하는 패턴을 검색할 때 사용되는 옵션 (최근에는 Pearl이 거의 쓰이지 않아서 예전 문법이라고 생각해도 좋음)
-E 옵션을 사용한 경우와 그렇지 않은 경우
ex. expression.txt 파일에서 q로 시작하고 소문자가 여러 개 나오고 ?로 끝나는 라인을 조회
grep -E 'q[[:lower:]]*\\??' expression.txt
매칭 제어 관련 옵션
- -e 패턴: 여러 개의 패턴 적용
- -f 파일: 패턴이 파일에 작성된 경우
- -i: 대소문자 구분 하지 않음
- -v: 해당 패턴을 제외하고 검색할 경우
- -w: 검색하고자 하는 단어가 정확하게 있는 라인만 검색
- -x: 검색하고자 하는 패턴과 정확하게 일치하는 라인만 검색
- -y: -i와 동일
- 실습
- ex. mail이나 phone 단어를 가진 라인을 조회
grep 'mail' expression.txt grep 'phone' expression.txt grep -e 'mail' -e 'phone' expression.txt
- 실습

- ex. 패턴에 일치하는 라인은 제거해서 조회 (#로 시작하는 라인과 $가 포함된 라인 제거)
cat expression.txt | grep -v '^#' | grep -v '\\$'

- w 옵션을 이용하면 정확하게 일치하는 데이터만 조회
grep -w 'expression' expression.txt

- x 옵션을 이용하면 라인 전체가 일치해야 한다.
grep -x 'help' expression.txt

출력 제어 관련 옵션
- -c: 패턴과 일치하는 단어의 개수를 리턴
- --color: GREP_COLORS 환경 변수에 의해 정의된 컬러에 맞게 검색한 패턴과 동일한 문자열의 색을 바꿔서 보여줌
- -L: 패턴과 일치하는 단어가 없는 파일명을 보여줌
- -l: 패턴과 일치하는 단어가 있는 파일명을 보여줌
- -m 라인수: 라인 수만큼 보여줌
- -o: 패턴과 일치하는 단어만 보여줌
- -q: 패턴과 일치하는 단어가 있든 없든 안 보여줌
- -s: 존재하지 않거나 읽을 수 없는 파일에 대한 오류 메시지를 안 보여줌
grep -c 'expression' expression.txt

grep -n 'expression' expression.txt

스크립트 활용
#!/bin/bash
# 명령어를 입력할 때 매개변수 첫 번째와 두 번째 입력이 있는 경우
if [[ -n $1 ]] && [[ -n $2 ]]
then
# 매개변수를 가지고 배열 생성
UserList=($1)
Password=($2)
# 배열을 순회하면서
for (( i=0; i<${#UserList[@]}; i++ ))
do
# /etc/passwd에 아이디가 없다는 것을 확인하고
if [[ $(cat /etc/passwd | grep $UserList[$i] | wc -l) == 0 ]]
then
# 계정 생성하고
sudo useradd ${UserList[$i]}
# 계정의 비밀번호 설정하고
echo ${Password[$i]} | sudo passwd ${UserList[$i]}
else
# 계정이 존재하면 이미 있다고 메시지 출력
echo "this user ${UserList[$i]} is existing"
fi
done
# 매개변수가 주어지지 않았을 때 메시지 출력
else
echo -e 'Please input user id and password.\\nUsage: adduser-script.sh "user01 user02" "pw01 pw02"'
fi

cat /etc/passwd #로 보면 user01, 02, 03 생긴 것을 확인할 수 있다.
시간을 내보내보는 것 -> 스크립트 파일을 만들어서 해볼 것!
클라우드 서비스 분류
- Infra를 빌려감 - OS가 설치된 컴퓨터
- 이 부분이 제일 많다. → 셸 프로그래밍을 잘 해야 한다.
- Platform을 빌려감 - 개발 플랫폼
- Service를 빌려감