[ 2020 2학기 / 6주차 ]

제10장 BASH 스크립트

 

1. BASH 쉘 소개

  Bash(Borune-again shell)

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

  -시작파일(start-up file)

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

 

  

  Bash 시작 과정

 

Bash 시작 과정

 

 

2. 별명 및 히스토리 기능

  2.1 별명

$ alias 단어=스트링

: 스트링이 나타내는 기존 명령에 대해 새로운 단어를 별명으로 정의

 

예)

  $ alias dir=‘ls –aF’

  $ dir

 

 

  2.2 히스토리

$ history

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

 

예)

$ history

1 ls

2 who

3 env

4 vi test.sh

5 chmod +x test.sh

6 test.sh

7 ls

8 date

9 history

...

 

 

  2.3 재실행

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

 

 

3. 변수

  3.1 단순 변수

$ 이름=단어

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

 

예)

$ city=seoul

$ echo $city

seoul

 

  • 변수에 어느 때나 필요하면 다른 값을 대입
    $ city=pusan
  • 한 번에 여러 개의 변수를 생성
    $ country=korean city=seoul
  • 한글 스트링을 값으로 사용
    $ country=대한민국 city=서울
    $ echo $country $city
  • 따옴표를 이용하면 여러 단어로 구성된 스트링을 저장
    $ address="서울시 용산구 청파동"

 

 

  3.2 리스트 변수

$ 이름=( 단어리스트 )

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

ㅎㄹㅇㄹㄴ

)

$ cities=(서울 부산 목포)

 

리스트 변수 사용

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

예)

$ echo ${cities[*]}

서울 부산 목포

$ echo ${cities[1]}

부산

 

 

  3.3 표준입력 읽기

$ read 변수1 ... 변수n

: read명령어 표준입력에서 한 줄을 읽어서 단어들을 변수들에 순서대로 저장
남은 단어들은 마지막 변수에 모두 저장

 

예)

$ read x y

Merry Christmas !

$ echo $x

Merry

$ echo $y

Christmas !

 

 

4. 지역변수와 환경변수

  4.1 환경변수와 지역변수

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

환경변수와 지역변수

  

 

  4.2 사전 정의 환경변수 

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

 

 

  4.3 사전 정의 지역 변수

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

 

 

5. BASH 쉘 스크립트

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

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

  5.2 if문 

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

 

 

  5.3 if-then-else

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

 

 

6. 수식

  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 두 문자열이 같으면 참 아니면 거짓
문자열 != 문자열2 두 문자열이 다르면 참 아니면 거짓
-n 문자열 문자열이 null이 아니면 참
-z 문자열 문자열이 null이면 참

 

 

  6.2 파일 관련 연산

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

 

 

  6.3 부울 연산자

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


  6.4 산술 연산자

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


$ let 변수=수식

: let 명령어를 이용한 산술연산

 

예)
$ let a=2*3

$ echo $a

6

$ let a=$a+2

$ echo $a

8

$ let a*=10

$ let b++

 

 

  6.5 변수 타입 선언

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

 

 

7. Bash 제어문

  7.1  조건

 

• if

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

 

if-then-else

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

 

  7.2 스위치

case 단어 in
    패턴1) 명령어리스트;;
    패턴2) 명령어리스트;;
    ...
    *) 명령어리스트;;
esac

 

  7.3 반복

 

• for 문

for 이름 in 단어리스트
do
    명령어리스트
done

 

• whlie 문

while 조건식
do
    명령어리스트
done

 

 

8. 고급 기능

  8.1 함수

 

• 함수 정의

함수이름()
{
명령어리스트
}

 

함수 호출

함수이름 [매개변수]

 

 

  8.2 디버깅

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

 

 

  8.3 shift

shift [리스트변수]

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

 

 

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

cd $dir
for file in *
do
    ...
done
  • 해당 디렉터리로 이동
  • for 문과 대표 문자 *를 사용
  • 대표 문자 *는 현재 디렉터리 내의 모든 파일 이름들로 대치

 

 

  8.5 리커전

• 스크립트도 자기 자신을 호출 가능

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

 

#!/bin/bash

# 사용법 rhead.bash [디렉터리]

# 대상 디렉터리와 모든 하위 디렉터리 내에 있는 파일들의 헤더를 프린트

 

 

  8.6 터미널에서 실행

 

•  터미널에서 while혹은 for문도 실행

$ for f in *
> do
> echo $f
> done

'Study > LINUX' 카테고리의 다른 글

[2020-2 리눅스 실습] 7주차  (0) 2020.11.14
[2020-2 리눅스 이론] 7주차  (0) 2020.11.14
[2020-2 리눅스 이론] 5주차  (0) 2020.10.31
[2020-2 리눅스 실습] 5주차  (0) 2020.10.31
[2020-2 리눅스 이론] 3주차  (0) 2020.09.25
복사했습니다!