- Shell 이란
- 변수
- Metacharacters
- Quoting Rule
- Nesting Commands
- Alias
- Prompt
1. Shell 이란
쉽게 말하면 Shell 이란 사용자 명령어 해석기라고 할 수 있다.
우리가 윈도우 운영체제에서 보는 윈도우 프롬프트와 비슷하다.
Shell은 사용자의 명령어를 해석하여 커널에게 전달하고 커널은 그 명령을 실행시킨다.
Shell의 종류는 다양하지만 대표적으로 Bourne Shell(sh), C Shell(csh), Korn Shell(ksh), Bourne Again Shell(bash) 등이 있다.
조개가 진주를 감싸고 있듯 사용자와 운영체제 내부(커널) 사이 인터페이스를 감싸고 있기에 Shell이라는 이름이 붙었다.
2. 변수
프로그래밍 언어를 배워보신 분이라면 금방 이해가 될 것이다.
변수는 데이터를 담는 상자와 같은 역할을 하며 Shell Script에서 다양하게 쓰인다.
변수
사용방법 : [변수 이름]=[변수에 저장할 데이터]
위 방법처럼 사용을 하면 변수에 데이터가 저장되며 출력할 때는 $을 붙여서 입력한다.
# name 이라는 변수에 abc 입력
name=abc
# number 라는 변수에 99 입력
number=99
# 출력
echo $abc $number
# 결과
abc 99
만약 변수의 값을 변경하고 싶으면 [변수 이름]=[변수에 저장할 데이터] 하면 된다.
이 때 기존의 내용은 덮어쓰기되어 입력한 값으로 변경된다.
환경변수
사용방법 : export [변수 이름]=[변수에 저장할 데이터]
사용방법은 일반변수 선언과 거의 동일하지만 앞에 export만 붙여주면 된다.
환경변수는 시스템에서 전역적으로 사용하는 변수로 값에 따라 시스템에 영향을 주게 된다.
우리가 쉽게 볼 수 있는 환경변수는 HOME, PATH, SHELL등이 있다.
HOME : 우리가 일반적으로 cd 명령어를 입력했을 때 홈디렉토리로 돌아오게 된다. 사실 cd 명령어는 HOME이라는 환경변수의 값에 따라 결정되는 것이므로 이를 변경하면 cd 명령어를 입력했을 때 변경한 HOME 환경변수의 값으로 이동하게 된다.
SHELL : 현재 우리가 사용하고 있는 Shell의 정보를 보여준다. chsh 명령어를 통해 사용하는 Shell 종류를 변경할 수 있다.
PATH : 우리가 UNIX나 LINUX운영체제를 통해 입력하는 명령어는 모두 PATH 환경변수에 있는 위치에 저장되어있다. 모든 명령어는 입력 시 PATH 환경변수에 저장된 디렉토리 위치로 가서 입력한 명령어 파일이 존재하는 지 찾으며 찾은 결과로 명령을 실행하기 때문에 PATH 환경변수를 함부로 변경하면 명령어가 실행이 되지 않는다.
### 환경변수 출력
# HOME
echo $HOME
# SHELL
echo $SHELL
# PATH
echo $PATH
# HOME 결과
/home/ubuntu
# SHELL 결과
/bin/bash
# PATH 결과
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
이는 기본적으로 Ubuntu Linux 운영체제를 설치했을 때부터 존재하는 환경변수이며 원한다면 자신이 환경변수를 추가할 수도 있다.
# 환경변수 생성
export NAME=xyz
# 환경변수 확인
env | grep NAME
# 환경변수 출력
echo $NAME
# 결과
xyz
env 명령어는 시스템의 모든 환경변수를 보여주는 명령어로 파이프 명령어인 | 와 grep으로 출력 결과를 필터해서 보여주도록 사용하는 것이 일반적이다.
set이라는 명령어도 있는데 이는 일반변수와 함수, 환경변수 등 모든 내용을 보여주는 명령어로 결과가 길기 때문에 이 또한 grep을 사용하여 원하는 부분만 볼 수 있도록 한다.
변수 해제
사용방법 : unset [변수 이름]
변수를 설정했으면 해제도 할 줄 알아야 한다.
간단하게 unset과 변수 이름만 쓰면 된다.
일반변수든 환경변수든 모두 위 명령어로 해제가 가능하다.
# 변수 해제
unset name
unset number
unset NAME
3. Metacharacters
Shell 에서 기존에 의미가 정해져 있는 문자가 있다.
| ? $ . .. * % ( ) { } [ ] 등
| : 앞에서 처리한 명령의 결과를 뒤로 전달
? : 와일드카드 문자로 임의의 문자 하나를 대체 (Any Single Character)
* : 와일드카드 문자로 모든 문자를 대체 (All Characters)
$ : 변수를 가리킴
.. : 상위 디렉토리. {}와 함께 쓰이며 {1..3}이라고 하면 1부터 3까지라는 의미를 가짐.
. : 현재 디렉토리
공백 : blank는 명령어와 option과 argument를 분리 시 사용
# 디렉토리 내 모든 파일이름 출력
echo *
# 디렉토리 내 첫 글자가 a로 시작하는 모든 파일이름 출력
echo a*
# 디렉토리 내 파일이름이 두글자인 모든 파일이름 출력
echo ??
# 디렉토리 내 파일이름이 두글자인데 마지막 글자가 a로 끝나는 모든 파일이름 출력
echo ?a
# 파일생성 시 파일이름을 file 뒤에 1부터 5까지 숫자를 붙여서 5개 파일 생성 (file1, file2, ..., file5)
touch file{1..5}
4. Quoting Rule
메타문자의 의미를 제거하고 단순 문자로 변경하는 문자들이다.
- Back Slash ( \ ) : 뒤에 오는 문자 하나를 단순 문자로 변경
- Double Quotes ( " " ) : "" 내의 모든 메타문자의 의미를 제거. 단, $, `` 는 제외
- Single Quotes ( ' ' ) : '' 내의 모든 메타문자의 의미를 제거
# \ 사용 예제
touch \*
# "" 사용 예제
touch "I can do it"
# '' 사용 예제
touch 'You can do it'
touch를 통해 원하는 이름의 빈 파일을 하나 생성했다.
* 와 공백은 의미를 가진 메타 문자로 직접 사용하게 되면 파일 생성이 안된다.
하지만 Quoting Rule을 통해 메타 문자의 의미를 제거하여 자유롭게 파일 이름을 지정할 수 있다.
5. Nesting Commands
명령어 안에 또 다른 명령어를 입력하여 결과로 치환 후에 실행하게 할 수도 있다.
### date라는 명령어를 함께 출력하기 위한 예제
# 1
echo 'This is date'
# 2
echo "This is $(date)"
# 3
echo "This is `date`"
# 4
echo "This is `date +%Y-%m-%d`"
# 1 결과
This is date
# 2 결과
This is Tue Nov 21 04:51:04 PM UTC 2023
# 3 결과
This is Tue Nov 21 04:51:04 PM UTC 2023
# 4 결과
This is 2023-11-21
2번과 3번은 같은 결과가 출력된다.
다만 묶을 때 홑따옴표로 묶으면 안되며 쌍따옴표로 묶어야한다.
홑따옴표는 모든 문자를 단순 문자로 변경하기에 명령이 적용이 안된다.
# 파일생성 시 다음과 같이 활용가능
touch report-$(date +%Y%m%d)_v1
touch report-`date +%Y%m%d`_v2
6. Alias
일종의 별명을 붙여주는 것이다.
기존의 명령어나 명령어 조합에 새로운 이름을 부여한다.
alias 등록
사용방법 : alias [별명]=['명령어 조합']
# clear에 c라는 이름을 부여
alias c='clear'
# history에 h라는 이름을 부여
alias h='history'
# rm -i에 rm이라는 이름을 부여
alias rm='rm -i'
rm이라는 명령어로 파일을 지울 때 다시 물어보지 않고 바로 지워버리는데 지우기 전에 반드시 한번 묻고 지울 수 있도록 alias를 걸어줄 수도 있다.
alias는 단순히 입력을 편하게 해주는 용도로 쓰이기도 하지만 불상사가 발생하지 않도록 방지해주기도 하므로 적절히 사용하면 많은 도움이 된다.
alias 확인
사용방법 : alias 또는 alias [별명]
alias 삭제
사용방법 : unalias [별명]
# alias 제거
unalias c
unalias h
unalias rm
7. Prompt
프롬프트 모양을 변경할 수도 있다.
위 프롬프트 형식은 PS1이라는 변수에 저장되어있다.
# PS1 변수 출력
echo $PS1
# 결과
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
아래와 같이 변경할 수도 있다.
# 프롬프트 형식 변경
PS1='[\u@\h \W]\$ '
위와 같이 모양새가 조금 바뀌었다.
특수문자 | 의미 |
\h | 호스트 이름 |
\u | 사용자 이름 |
\w | 작업 디렉토리 - 절대경로 |
\W | 작업 디렉토리 - 상대경로 |
\d | 오늘 날짜 |
\t | 현재 시간 |
\$ | $ 또는 # 프롬프트 모양 |
위 표에 따라 원하는대로 PS1 변수를 구성하여 변경하면 된다.
참고사항
변수와 alias 와 프롬프트의 경우 현재 로그인 상태에서만 값이 유지되고 다시 로그인했을 때는 원래 기본값으로 바뀐다.
이 때 명령을 홈디렉토리에 있는 .bashrc에 등록하면 해당 유저로 로그인했을 때 설정한 대로 값이 유지가 된다.
아래 영상을 참고하였다.
https://youtube.com/playlist?list=PLApuRlvrZKog2XlvGJQh9KY8ePCvUG7Je&si=Cs3BZbaUIq_UA0y7
'Shell Script' 카테고리의 다른 글
Shell Script 보안 - 코드 인젝션 취약점 (0) | 2023.11.24 |
---|---|
Shell Script 기초(5) (0) | 2023.11.24 |
Shell Script 기초(4) (0) | 2023.11.24 |
Shell Script 기초(3) (0) | 2023.11.23 |
Shell Script 기초(2) (0) | 2023.11.22 |