교재 : 리눅스 시스템 원리와 실제 (창병모, 생능출판)
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 | 로그인 쉘의 경로명 |
메일 박스의 경로명 | |
$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문도 실행 가능
'전공과목 정리 > 리눅스시스템 + 시스템프로그래밍' 카테고리의 다른 글
[리눅스시스템🐧] 12장 파일 시스템과 파일 입출력 (2) | 2024.01.07 |
---|---|
[리눅스시스템🐧] 11장 프로그래밍 환경 (2) | 2024.01.06 |
[리눅스시스템🐧] 9장 유틸리티 (4) | 2024.01.05 |
[리눅스시스템🐧] 8장 파일 유틸리티 (4) | 2024.01.05 |
[리눅스시스템🐧] 7장 인터넷과 서버 (2) | 2024.01.03 |