혜랑's STORY

[2020-2학기 리눅스 6주차] : 이론 본문

2020 SISS 21기 활동/2학기 리눅스

[2020-2학기 리눅스 6주차] : 이론

hyerang0125 2020. 11. 7. 23:47

# BASH 쉘 소개

- BASH(Botune-again shell) : 리눅스, 맥 OS 등의 운영 체제의 기본 쉘

- 시작 파일(start-up file)

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

- Bash 시작 과정

Bash 시작 과정

 

# 별명 및 히스토리 가능

- 별명 : alias 명령어

  • $ alias 단어 = 스트링 : 스트링이 나타내는 기존 명령에 대해 새로운 단어를 별명으로 정의
  • $ alias : 현재까지 정의된 별명들을 확인(별명 리스트)
  • $ unalias 단어 : 이미 정의된 별명 해제

- 히스토리

  • $ history : 입력된 명령들을 기억하는 기능
  • $ HISTORY = 100 : 기억할 히스토리의 크기
  • $ HISTFIESIZE  = 100 : 로그아웃 후에도 히스토리가 저장되도록 설정

- 재실행

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

 

# 변수

- 단순 변수(simple variable) : 하나의 값(문자열)만을 저장할 수 있는 변수

$ 이름 = 단어

예)
$ city = seoul                           #변수 선언
$ echo $city                             #변수의 값 사용
S city = pusan                          #변수에 다른 값 대입
$ country = korea city = seoul     #한번에 여러개의 변수를 생성
$ country = 대한민국                 #한글 스트링을 값으로 사용 가능
$ address = "용산구 청파동"        #따옴표를 이용하면 여러 단어로 구성된 스트링을 저장

- 리스트 변수(list variable) : 한 변수에 여러개의 값(문자열)을 저장할 수 있는 변수

$ 이름 = (단어 리스트)
-> $ city = (서울 부산 목포)
리스트 사용 의미
$ {name[i]} 리스트 변수 name의 i번째 원소
$ {name[*}
$ {name[@]}
리스트 변수 name의 모든 원소
$ {#name[*]}
$ {#name[@]}
리스토 변수 n 내의 원소 개수

 

# 지역변수와 환경변수

- 쉘 변수 : 환경변수와 지역변수 두 종류로 나눌 수 있다. 환경변수는 값이 자식프로세스에게 상속되며 지역변수는 그렇지 않다.

환경변수와 지역변수

- 사전 정의 환경변수(predefined environment variable) : 의미가 미리 정해진 환경변수들

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

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

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

 

# BASH 쉘 스크립트

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

  1. 에디터를 사용하여 Bash 스크립트 파일을 작성한다.
  2. chmod를 이용하여 실행 모드로 변경한다.
  3. 스크립트 이름을 타이핑하여 실행한다.

- if 문

if 조건식
then
    명령어 리스트
fi

- if - then - else 문

if 조건식
then
    명령어 리스트
else
    명령어 리스트
fi

 

# 수식

- 비교 연산자

산술 비교 연산자 의미
정수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이면 참

- 파일 관련 연산

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

- 부울 연산자

  • ! : 부정(negation)
  • && : 논리곱(logical and)
  • || : 논리합(logical or)

- 산술 연산

  • 산술연산
$ a = 2+ 3
$ echo $ a
$ a = `expr 2 + 3 ` (역따옴표, 띄어쓰기 주의!)
  • 산술 연산자
산술 연산자 의미
- 단일항 음수
! 논리 부정
*, /, % 곱셈, 나눗셈, 나머지
+, - 덧셈, 뺄셈
<<, >> 비트 좌이동, 비트 우이동
<=, >=, <, > 관계 연산
==, != 동등, 비동등
||, && 논리합, 논리곱
&, ^, | 비트 and, 비트 xor, 비트 or

- 산술 수식 : ((수식))

if (($# != 1))
then
    ehco 사용법: $0 파일
    exit 1
fi

- 변수 타입 선언 : declare

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

 

# 조건문

- Bash 제어구조

  • 조건 if
(1)
if 조건식
then 
    명령어 리스트
fi

(2)
if 조건식
then 
    명령어 리스트
else
    명령어 리스트

(3) 중첩 조건문
if 조건식
then
    명령어 리스트
elif 조건식
then
    명령어 리스트
else
    명령어 리스트
fi
  • 스위치 case
case 단어 in
    패턴1) 명령어 리스트;;
    패턴2) 명령어 리스트;;
    ....
    *) 명령어 리스트;;
esac

 

# 반복문

  • for 구문 : 리스트의 각 값에 대해서 명령어들을 반복
for 이름 in 단어 리스트
do
    명령어 리스트
done

+) 모든 명령줄 인수 처리

for file in $*
do
    ...
done
  • while 문 : 조건에 따라 명령어들을 반복적으로 실행
while 조건식
do
    명령어 리스트
done

 

# 고급 기능

- 함수

  • 함수 정의
함수이름()
{
    명령어 리스트
}
  • 함수 호출
함수이름 [매개변수]


- 디버깅

- shift : shift[리스트 변수] 내의 원소들을 하나씩 왼쪽으로 이동

- 디렉터리 내의 모든 파일 처리

  • 해당 디렉터리로 이동
  • for문과 대표문자 *를 사용
  • 대표문자 *는 현재 디렉터리 내의 모든 파일 이름들로 대치
cd $dir
for file in *
do
    ...
done
  • 리커전 (recursion) : 스크립트도 자기 자신을 호출 가능. 어떤 디렉터리의 모든 하위 디렉터리에 대해 동일한 작업을 수행할 때 매우 유용함.
  • 터미널에서 실행 : 터미널에서 while 혹은 for문도 실행
$ for f in *
> do
> echo $f
> done