[ 2020 2학기 / 6주차 ]
제10장 BASH 스크립트
1. BASH 쉘 소개
Bash(Borune-again shell)
-리눅스, 맥 OS X 등의 운영 체제의 기본 쉘
-시작파일(start-up file)
- /etcprofile
전체 사용자에게 적용되는 환경 설정, 시작 프로그램 지정 - /etc/bashrc
전체 사용자에게 적용되는 별명과 함수들을 정의 - ~/.bash_profile
- 각 사용자를 위한 환경을 설정, 시작 프로그램 지정
- ~/.bashrc
각 사용자를 위한 별명과 함수들을 정의
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 | 로그인 쉘의 경로명 |
메일 박스의 경로명 | |
$HOSTNAME | 호스트 이름 |
4.3 사전 정의 지역 변수
이름 | 의미 |
$$ | 쉘의 프로세스 번호 |
$0 | 쉘 스크립트 이름 |
$1~$9 | 명령줄 인수 |
$* | 모든 명령줄 인수 리스트 |
$# | 명령줄 인수의 개수 |
5. BASH 쉘 스크립트
5.1 Bash 스크립트 작성 및 실행 과정
- 에디터를 사용하여 Bash 스크립트 파일을 작성한다.
- chmod를 이용하여 실행 모드로 변경한다.
- 스크립트 이름을 타입핑하여 실행한다.
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 |