[Shell] 01. Bash 쉘 환경
카테고리: BASH
태그: bash
01) Bash shell 초기화 파일
| 적용 범위 | 내용 |
|---|---|
| 시스템 전체 | 이 파일은 시스템 관리자가 관리하는 파일, bash 쉘 사용자 전체에게 영향을 주기 위해 사용한다. |
| 사용자 구성 | 이 파일은 시스템 사용자가 관리하는 파일, 사용자에 한정되어 영향을 주기 위해 사용한다. |
a) 시스템 전체
-
사용자 로그인 후 bash 쉘이 실행될 때 bash 쉘에 의해 읽어지고 실행되는 파일
-
bash 사용자 전체에게 영향을 주기 위해 사용되는 파일이기 때문에 시스템 관리자에 의해 관리된다.
| 파일 | 내용 |
|---|---|
| /etc/profile | 리눅스 시스템 전반에 적용되는 환경 변수들을 설정 |
| /etc/bashrc | 시스템 alias와 함수들, 시스템 전반에 적용되는 umask, 프롬프트 형태 지정 |
b) 사용자 구성
-
사용자 로그인 후 bash 쉘이 실행될 때 bash 쉘에 의해 읽어지고 실행되는 파일
-
bash 쉘을 사용하는 사용자에 한정되어 영향을 주는 파일이며 사용자의 홈 디렉토리에 존재하는 파일이다.
| 파일 | 내용 |
|---|---|
| $HOME/.bash_profile | 사용자 환경 설정과 시작 프로그램들을 제어하는 파일, 사용자의 홈 디렉토리를 PATH 변수에 추가하는 등의 설정 |
| $HOME/.bashrc | 사용자 별 alias와 함수들 초기화 |
| $HOME/.bash_logout | 로그아웃 진행 전 배시 쉘에 의해 읽어지고 실행되는 파일 |
02) 변수 정의 및 호출
# '변수이름=값'
$ A=1
$ NAME=test
$ MAIL='test@test.com'
$ DATE=`date "+%Y-%m-%d %H:%M"`
# 호출
$ echo "TIME : $DATE
Hello ${NAME}, ${A}.$MAIL"
TIME : 2021-05-03 09:25
Hello test, 1.test@test.co
# 사용자로부터 값을 받기
$ read NAME
TEST
$ echo $NAME
TEST
$ cat name.sh
#!/bin/bash
echo -n "Enter your name : "
read NAME
echo
echo "Your name is $NAME."
$ bash name.sh
Enter your name : test
Your name is test.
03) 지역변수 환경변수
a) set, unset - 정의된 변수를 확인, 변수 해제
# 정의된 변수를 확인
$ NAME=test
$ set | grep ^NAME=
NAME=test
# 변수 해제
$ unset NAME
$ set | grep ^NAME=
b) export : 환경변수 선언 및 조회, env : 환경 변수 확인
# $ 변수는 특수 변수이며 현재 프로세스에 대한 PID를 가지고 있다.
# $$의 결과값이 bash 프로세스의 PID와 동일한 것을 확인할 수 있다.
$ echo $$
1595
$ ps
PID TTY TIME CMD
1595 pts/0 00:00:00 bash
1690 pts/0 00:00:00 ps
# bash 명령을 실행하여 하위 쉘을 생성
# 그 안에서 NAME과 AGE 변수값을 호출하면 아래와 같이 값이 출력되지 않는 것을 확인할 수 있다.
$ NAME=test
$ AGE=10
$ echo "$NAME is $AGE years old."
test is 10 years old.
$ bash
$ echo $$
1730
$ ps
PID TTY TIME CMD
1595 pts/0 00:00:00 bash
1730 pts/0 00:00:00 bash
1745 pts/0 00:00:00 ps
$ echo "$NAME is $AGE years old."
is years old.
$ exit
exit
$ echo $$
1595
$ ps
PID TTY TIME CMD
1595 pts/0 00:00:00 bash
1746 pts/0 00:00:00 ps
# export 명령을 사용하여 NAME 을 환경변수로 선언
$ export NAME
$ bash
$ echo $$
1750
$ ps
PID TTY TIME CMD
1595 pts/0 00:00:00 bash
1750 pts/0 00:00:00 bash
1765 pts/0 00:00:00 ps
$ echo "$NAME is $AGE years old."
test is years old.
# 선언한 변수를 해제하기 위해 unset 명령을 사용
$ exit
exit
$ unset NAME
$ unset AGE
$ echo "$NAME is $AGE years old."
is years old.
04) 특수 변수
a) 위치 파라미터
| 이름 | 설 명 |
|---|---|
| $0 | 명령 이름을 나타냄. 여기서는 쉘 스크립트 파일명 반환 |
| $1-${N} | $1는 첫번째 인자, $2는 두번째 인자 $9는 아홉번째 인자, ${10}은 열번째 인자 반환 |
| $# | 인자의 총 수를 반환 |
| $* | 모든 인자를 반환 |
| $@ | 모든 인자를 반환 |
b) 기타 특수 변수
| 이름 | 설 명 |
|---|---|
| $$ | 현재 쉘의 PID를 반환 |
| $? | 가장 최근에 전면부로 실행한 명령의 exit 상태를 반환. 0은 명령 실행 성공, 0이 아닌 다른 수는 실패 |
| $! | 마지막 백그라운드로 실행되고 작업의 PID를 반환 |
05) 예약 변수와 별칭
a) 예약 변수
| 이름 | 설 명 |
|---|---|
| BASH | 사용하고 있는 bash 쉘의 경로 |
| BASH_VERSION | 사용하고 잇는 bash 쉘의 버전 |
| COLUMNS | 터미널의 행 수(기본 값 = 80) |
| DISPLAY | 현재 X-Window Display 위치 |
| HISTFILE | 히스토리 파일의 이름 |
| HISTFILESIZE | 히스토리 파일 사이즈 |
| HISTSIZE | 히스토리의 개수 HOME 사용자의 홈 디렉토리 |
| HOSTNAME | 시스템의 호스트명 HOSTTYPE 시스템의 타입 값 |
| LINES | 터미널의 라인 수 |
| LOGNAME | 로그인 사용자 명 |
| LS_COLORS | ls 명령어 사용 시 파일 종류별 색상 지정 |
| 메일 저장 위치 | |
| MAILCHECK | 메일 점검 시간(기본 값 = 60초) |
| MANPATH | man 페이지의 경로 |
| OSTYPE | 운영체제의 타입 |
| PATH | 명령을 찾을 검색 경로 |
| PS1 | 주 프롬프트 문자열 설정 값 |
| UID | 현재 사용자의 UID 값 |
b) 별칭
# 별칭 정의
$ fs
-bash: fs: command not found
$ alias fs='df -kF xfs | tail -n +2'
$ fs
/dev/mapper/rl-root 17811456 1681220 16130236 10% /
/dev/sda1 1038336 248940 789396 24% /boot
# 별칭 내용 확인 및 제거
$ alias fs
alias fs='df -kF xfs | tail -n +2'
$ unalias fs
$ alias fs
-bash: alias: fs: not found
06) 함수
a) 함수 선언 형식
함수이름() {
명령1;
명령2;
...; }
b) 함수 사용 예제
# 예제 01
$ cat test.sh
#!/bin/bash
hello() {
echo "Hello, $USERNAME
Date & Time : `date`";
}
echo "-----------------"
pwd
echo "-----------------"
hello
$ bash test.sh
-----------------
/root
-----------------
Hello, root
Date & Time : Wed May 3 04:20:34 PM KST 2023
# 예제 02
$ cat test.sh
#!/bin/bash
arguments(){
echo "script filename is $0
first argument is $1
second argument is $2";
}
arguments 1 2
$ bash test.sh
script filename is test.sh
first argument is 1
second argument is 2
# 예제 03
$ cat test.sh
#!/bin/bash
getinfo(){
echo -n "user account name: ";read ACCNAME
echo -n "default shell: ";read SHELLPATH
echo -n "user account comment: ";read SHELLCOMMENT
}
createuser(){
useradd -s $1 -c $2 $3
}
getinfo
createuser $SHELLPATH $SHELLCOMMENT $ACCNAME
if [ $? -eq 0 ]; then
echo;echo "$ACCNAME user account created complete."
grep $ACCNAME /etc/passwd
fi
$ bash test.sh
user account name: test02
default shell: /bin/bash
user account comment: testuser
test02 user account created complete.
test02:x:1001:1001:testuser:/home/test02:/bin/bash
댓글 남기기