전공과목 정리/리눅스시스템 + 시스템프로그래밍

[리눅스시스템🐧] 10장 Bash 쉘 스크립트

최연재 2024. 1. 6. 03:53

교재 : 리눅스 시스템 원리와 실제 (창병모, 생능출판)

 

10.1 Bash 쉘 소개

1) Bash(Borune-again shell) 

- 리눅스, 맥 OS X 등의 운영체제 기본 쉘

- Bash 문법은 본 쉘의 문법을 대부분 수용하면서 확장

- 시작 파일

  • /etc/profile : 전체 사용자에게 적용되는 환경설정, 시작 프로그램 지정
  • /etc/bash.bashrc : 전체 사용자에게 적용되는 별명들과 함수들 정의
  • ~/.bash_profile : 각 사용자를 위한 환경을 설정, 시작 프로그램 지정
  • ~/.bashrc : 각 사용자를 위한 별명과 함수들을 정의

2) Bash 시작 과정

 

 

10.2 별명 및 히스토리 기능

1) 별명

-  alias 명령어 : 문자열이 나타내는 기존 명령에 대해 새로운 이름을 별명으로 정의

$ alias 이름=문자열

- 현재까지 정의된 별명들을 확인 : 별명 리스트

$ alias

- 이미 정의된 별명 해제

$ unalias 단어

 

2) 히스토리

- 입력된 명령들을 기억하는 기능

$ history [-rh] [번호]

- 기억할 히스토리의 크기

$ HISTSIZE=100

- 로그아웃 후에도 히스토리가 저장되도록 설정

$ HISTFILESIZE=100

 

3) 재실행

형태 의미
!! 바로 전 명령 재실행
!n 이벤트 번호가 n인 명령 재실행
!시작스트링 시작스트링으로 시작하는 최후 명령 재실행
!?서브스트링 서브스트링을 포함하는 최후 명령 재실해

 

10.3 변수

1) 단순 변수(simple variable)

- 하나의 값(문자열)만을 저장할 수 있는 변수

 $ 변수이름=문자열

- 한 번에 여러 개의 변수 생성 가능 

 $ 변수이름=문자열 변수이름=문자열

 

- 한글 문자열을 값으로 사용 가능

- 따옴표를 이용하여 여러 단어로 구성된 문자열 저장 가능

 

2) 리스트 변수

- 한 변수에 여러 개의 값(문자열)을 저장할 수 있는 변수

$ 이름=( 문자열리스트 )

- 리스트 변수 사용

리스트 사용 의미
${mylist[i]} 리스트 변수 mylist의 i번째 원소
${mylist[*]}
${mylist[@]}
리스트 변수 mylist의 모든 원소
${#mylist[*]}
${#mylist[@]}
리스트 변수 mylist의 원소 개수

 

3) 표준입력 읽기

- read 명령어

  • 표준입력에서 한 줄을 읽어서 단어들을 변수들에 저장
  • 마지막 변수에 남은 문자열을 모두 저장
$ read 변수1 ... 변수n

 

10.4 지역변수와 환경변수

1) 지역변수와 환경변수

- 쉘 변수는 지역변수 환경변수 두 종류로 나눌 수 있다.

- 환경 변수는 값이 자식 프로세스에게 상속되며 지역변수는 그렇지 않다.

- 환경변수 : export 키워드 사용

 

2) 사전 정의 환경변수 (predefined environment variable)

: 의미가 미리 정해진 환경변수들

이름 의미
$USER 사용자 이름
$TERM 터미널 타입
$PATH 명령어를 검색할 디렉터리들의 리스트
$HOME 홈 디렉터리
$SHELL 로그인 쉘의 경로명
$MAIL 메일 박스의 경로명
$HOSTNAME 호스트 이름

 

3) 사전 정의 지역변수 (predefined local variable)

이름 의미
$$ 쉘의 프로세스 번호
$0 쉘 스크립트 이름
$1 ~ $9 명령줄 인수
$* 모든 명령줄 인수 리스트
$# 명령줄 인수의 개수

 

10.5 Bash 쉘 스크립트

- Bash 쉘 스크립트 작성 및 실행 과정

(1) 에디터를 사용하여 Bash 스크립트 파일을 작성한다.

ex)

#!/bin/bash

...

 

(2) chmod를 이용하여 실행 모드로 변경한다.

$ chmod +x state.bash

(3) 스크립트 이름을 타이핑하여 실행한다.

$ state.bash

 

10.6 수식

1) 비교 연산

- 산술 비교 연산

산술 비교 연산자 의미
정수1 -eq 정수2 두 정수가 같으면 참 아니면 거짓
정수1 -ne 정수2 두 정수가 다르면 참 아니면 거짓
정수1 -gt 정수2 정수1이 정수2보다 크면 참 아니면 거짓
정수1 -ge 정수2 정수1이 정수2보다 크거나 같으면 참 아니면 거짓
정수1 -lt 정수2 정수1이 정수2보다 작으면 참 아니면 거짓
정수1 -le 정수2 정수1이 정수2보다 작거나 같으면 참 아니면 거짓

- 문자열 비교 연산

문자열 비교 연산자 의미
문자열1 == 문자열2 두 문자열이 같으면 참 아니면 거짓
문자열1 != 문자열2 두 문자열이 다르면 참 아니면 거짓
-n 문자열 문자열이 null이 아니면 참
-z 문자열 문자열이 null이면 참

 

2) 파일 관련 연산

파일 관련 연산자 의미
-a 파일
-e 파일
해당 파일이 존재하면 참.
-r  파일 사용자가 해당 파일을 읽을 수 있으면 참
-w  파일 사용자가 해당 파일을 쓸 수 있으면 참
-x  파일 사용자가 해당 파일을 실행할 수 있으면 참
-O 파일 사용자가 해당 파일의 소유자이면 참
-z 파일 해당 파일의 크기가 0이면 참
-f 파일 해당 파일이 일반 파일이면 참
-d 파일 해당 파일이 디렉터리이면 참.

 

3) 부울 연산자 : 조건식에 부울 연산자 사용

- 부정(negation) : !

- 논리곱(logical and) : &&

- 논리합(logical or) : ll

 

4) 산술 연산

- expr 사용

$ a=2+3
$ echo $a
2+3
$ a=`expr 2 + 3`
$ echo $a
5

 

- let 명령어를 이용한 산술 연산 : let 변수=수식

$ let a=2*3
$ echo $a
6

 

5) 변수 타입 선언 : declare

이름 의미
declare -r 변수 읽기 전용 변수로 선언
declare -i 변수 정수형 변수로 선언
declare -a 변수 배열 변수로 선언
declare -f 스크립트 안에서 정의된 모든 함수들을 보여줌 
declare -f 함수이름 해당 함수 이름을 보여줌
declare -x 변수 환경변수로 export

 

10.7 Bash 제어구조

1) Bash 제어구조

- 조건 : if

- 스위치 : case

- 반복 : for, while

 

2) 조건문

(1) if문

- 조건식 : [ 수식 ] ex) [ $# -eq 1 ]

if 조건식
then
    명령들
fi

 

(2) if-then-else 구문

if 조건식
then
    명령들
else
    명령들
fi

 

(3) 중첩 조건문

if 조건문
then
    명령들
elif 조건식
then
  명령들
else
    명령들
fi

 

(4) 새로운 조건문 : if ((수식))

ex) if (( $# == 1 )) ...

<=> if [ $# -eq 1 ]

 

* 산술 연산자

산술 연산자 의미
- 단일항 음수
! 논리 부정
* / % 곱셈, 나눗셈, 나머지
+ - 덧셈, 뺄셈
<< >> 비트 좌이동, 비트 우이동
<= >= < > 관계 연산
== != 동등, 비동등
|| && 논리합, 논리곱
& ^ | 비트 and, 비트 nor, 비트 or

 

3) 스위치

case $변수 in
   패턴1) 명령들;;
   패턴2) 명령들;;
   ...
   *) 명령들;;
esac

 

4) 반복문

(1) for

- 리스트의 각 값에 대해서 명령어들을 반복

for 이름 in 리스트
do
    명령들
done

- 모든 명령줄 인수 처리 : $*

ex)

for file in $*
do
    echo $file
done

 

(2) while 

- 조건에 따라 명령어드를 반복적으로 실행

while 조건식
do
    명령들
done

 

10.8 고급 기능

1) 함수

- 함수 정의

함수이름()
{
    명령들
}

- 함수 호출 : 함수이름 [매개변수]

 

2) 디버깅

$ bash -vx 스크립트 [명령줄 인수]

 

3) shift

- shift 명령어 : shift [리스트변수]

- 명령줄 인수[리스트변수] 내의 원소들을 하나씩 왼쪽으로 이동

 

4) 디렉터리 내의 모든 파일 처리

- for문과 대표문자 * 를 사용

- 대표문자 *는 현재 디렉터리 내의 모든 파일 이름들로 대치

cd $dir
for file in *
do 
    echo $file
done

 

5) 리커전 (recursion)

- 스크립트도 자기 자신을 호출할 수 있음.

- 어떤 디렉터리의 모든 하위 디렉터리에 대해 동일한 작업을 수행할 때 매우 유용함.

- 호출 시 스크립트의 절대경로 이용

 

6) 터미널에서 실행

- 터미널에서 while 혹은 for문도 실행 가능