Shell Script

Shell Script 기초(1)

사실 나도 모름 2023. 11. 22. 03:11
  1. Shell 이란
  2. 변수
  3. Metacharacters
  4. Quoting Rule
  5. Nesting Commands
  6. Alias
  7. 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에 등록하면 해당 유저로 로그인했을 때 설정한 대로 값이 유지가 된다.

.bashrc 파일을 vi나 vim editor로 들어가서 수정한다.
맨 밑 줄에 입력한 명령을 바탕으로 로그인 시 명령이 항상 적용되어 실행된다.

 

 

 

아래 영상을 참고하였다.

https://youtube.com/playlist?list=PLApuRlvrZKog2XlvGJQh9KY8ePCvUG7Je&si=Cs3BZbaUIq_UA0y7

 

[따배셸] 셸 프로그래밍 시리즈

 

www.youtube.com

'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