Linux
쉘 프로그래밍
Linux bash 쉘 스크립트 변수, 함수, 조건문, 반복문, 정규표현식 정리
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→ 현재 스크립트 또는 명령어의 PIDS?→ 최근에 실행된 명령어나 함수, 스크립트의 종료 상태S!→ 최근에 실행된 백그라운드의 PIDS-→ 현재 옵션 플래그변수 확장
- 변수와 문자열을 연속하여 사용할 때는 변수를
{ }로 감싸야 함 - 변수 초기화를 위한 확장 변경자
- 헷갈려서 안 적음
변수 확장 상세
값이 없는 경우 치환을 위한 확장자
:을 생략하고${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
위의 expression.txt 를
scp로 서버에 전송
C로 시작해 U로 끝나는 3글자→grep C.U expression.txt→CPU model is Intel(R) Core(TM) i7-8665U CPU @ 1.90GHzC로 시작해 e로 끝나는 4글자 → grep C..e expression.txt → CPU model is Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz
q로 시작해 ?로 끝나는 단어이며 영소문자가 개수에 상관 없이 중간에 존재하는 것을 검색 →
grep q[[:lower:]]*\? expression.txt→ Do you have any questions? or Do you need any help?
-다음 숫자 2가 1번 이상 반복,-로 끝나는 단어 검색 →grep -E '\-2+\-' expression.txt(특수문자가 있어 -E와 Single Quote로 묶어줌) → 010-2222-5668
#으로 시작하는 단어 검색 →grep -E '^#' expression.txt영문 5글자 뒤
:이 오는 단어 검색 →grep -E '^#' expression.txt영문 5글자 뒤 공백을 가진 단어 검색 →
grep -E '^[a-zA-z]{5}[[:space:]]' expression.txt영문 4글자 이상 6글자 이하로 끝나는 단어 검색 →
grep -E '^[a-zA-z]{5}[[:space:]]' expression.txt숫자 4글자 이상 6글자 이하와
.으로 끝나는 단어 검색 →grep -E '[[:digit:]]' expression.txt→ 이거 수정필요
댓글