본문 바로가기
Work/Server

[Linux] Bash Shell 설정과 문법정리

Index

  1. Shell이란?
  2. Shell 종류
  3. Shell 설정
  4. Shell 프롬프트
  5. Shell 사용 문법

 

Shell 이란 ?

 1. 쉘(Shell) 은 커널과 사용자 사이를 이어주는 역할을 해준다. 

 2. 쉘(Shell) 은 하나의 명령어 처리기(Command Processor)이다.

 3. 그래서 사용자로부터 명령어를 입력 받아서 해당 명령어를 처리해준다.

 우리가 흔히 사용하는 윈도우의 명령 프롬프트(CMD) 도 쉘이다.

 

 

Shell 종류

1. Bourne Shell (sh)

 Bourne Shell 은 1974년 'Stephen Bourne'  (스티브 본) 이 개발하였고, 최초의 쉘(Shell) 이다. 대부분의 리눅스에 기본적으로 설치가 되어있다. 설치 위치는 '/bin/sh' 이다.

 

2. C Shell (csh)

C Shell 은 1978년 'Bill Joy' (빌 조이가 개발한 쉘(Shell) 이다. C Shell 은 Bourne Shell 의 사용성을 높이고, 더욱 한 층 강력하게 만들어졌다. C Shell 은 이름에서 보이다시피 C 언어를 기반으로 만든 Shell 이다. 때문에 강력한 프 로그램 작성 기능을 지니었다. 설치 위치는 '/bin/csh' 이다.

 

3. tee-see-Shell (tcsh)

tee-see-Shell 은 'Carnegie Mellon University' (카네기 멜런 대학교) 의 학생들이 개발하여 1983년. 소스코드를 게시하였다. 간단하게 설명하면 C Shell 에서 명령 행 완성과 명령 행 편집 기능을 추가한 것이다. 초기 맥 OS X 는 tcsh를 기본 셸로 포함하고 있었다. (하지만 배시 쉘에 밀려버렸다.) 설치 위치는 '/bin/tcsh' 이다.

 

4. Z Shell (zsh)

Z Shell 은 'Paul Falstad' (폴 폴스타드) 가 1990년 대학교에 재학 중 일 때 첫 버전을 작성하였다. Z Shell 은 지금까지의 수 많은 쉘(Shell) 들의 기능을 머금고 있다. 그렇기 때문에 많은 개선 사항들이 갖추어진 확장형 Bourne Shell 이다. 설치 위치는 '/bin/zsh' 이다.

 

 5. Bourne-again shell (bash)

Bourne-again shell 은 지금 현 시대에 가장 많이 쓰이는 Shell 이라고 생각한다. 줄여서 Bash Shell 은 GNU 프로젝트를 위해 'Brian Fox' (브라이언 폭스) 가 작성한 쉘(Shell) 이다. GNU 운영체제와 리눅스, 맥 OS 등 기본 쉘로 채택 되어있다. (사실상 모든 리눅스가 기본으로 Bash Sehll 만을 사용한다...)  C Shell 과 Bourne Shell 의 기능들이 많이 포함 되어 있다. 대부분 Shell Script 라고 검색을 하면 기준이 십중팔구는 Bash Shell 로 작성 되어 있다. 그만큼 자료가 방대면서 배우기 쉽고, 강력하다는 증거이다. 설치 위치는 '/bin/bash' 이다.

이 외에도 많은 쉘이 존재한다.

 

 

Shell 설정

이제부터는 리눅스 (bash)shell 을 다뤄보자

현재 설치된 Shell 확인

cat /etc/shells
# 또는
chsh -l

 

현재 지정된 Shell 확인

echo $SHELL
# 또는
grep 사용자ID /etc/passwd

 

설정 Shell 종류 변경 (ksh로 변경)

usermod -s /bin/ksh
# 또는
chsh -s /bin/ksh

필요한 Shell이 설치되어있지 않다면, 해당 리눅스 계열에 맞는 명령어로 yum, rpm 등으로 설치하여 사용하자.

 

+  P. S - 로그인시, 파일 읽는 순서 

추가로 사용자가 계정으로 로그인 함과 동시에 읽어드리는 쉘 설정 파일들이 존재한다. (profile, bash 등..)

해당 파일들을 읽어 드리는 순서는 아래와 같다

 

 

  1. /etc/profile
    로그인 과정에서 제일 먼저 실행되는 환경 파일
    root로 로그인 하는 경우 일반사용자들과는 달리 PATH 변수에 관리 명령이나 도구가 설치되어 있는 /sbin, /usr/sbin, /usr/local/sbin 경로가 설정
  2. /etc/profile.d/*.sh
  3. ~/.bash_profile
  4. ~/.bashrc
  5. /etc/bashrc

 

 

Shell 프롬프트 설정

프롬프트는 커멘드상에서 입력줄에 표시되는 기본정보 부분을 가리킨다.

설정은 사용자별로 ~./bashrc에서 $PS1 , $PS2() 변수에 지정하여 사용하는것이 일반적이다.

모든계정에 대한 설정은 /etc/bashrc 또는 /etc/profile.d/prompt.sh 파일을 수정하여 설정한다.

프롬프트에 사용하는 옵션은 아래와 같다.

 

프롬프트 옵션

\t 24시간의 단위로 현재시각을 HH:MM:SS 로 표시
\T 12시간의 단위로 현재시각을 HH:MM:SS 로 표시
\@ 12시간의 단위로 현재시각을 오전/오후 로 표시
\d 현재 날짜를 나타냄. 요일, 월, 일 형식으로
\s 현재 사용중인 쉘의 이름을 나타냄 (C쉘이면 /bin/csh, bash쉘이면 /bin/bash)
\w 현재 디렉토리의 전체 절대경로를 모두 표시함
\W 현재 디렉토리의 전체 절대경로명 중 마지막 디렉토리명만을 표시함. 즉 현재디렉토리만 표시함
\u 사용자명을 표시함
\h 서버의 호스트명을 표시함 (www.uzuro.com에서 www 부분)
\H 서버의 도메인명을 표시함 (www.uzuro.com에서 uzuro.com 부분)
\# 접속한 순간부터 사용한 명령어의 번호를 1번부터 차례대로 표시함
\! 사용한 명령어의 history 번호를 표시함
\\$ 현재 사용자가 root(uid 가 0 )이면 # 을 표시하고 아니면 $ 를 표시함
\\ '\' 문자 자체를 표시함
\a ASCII 종소리 문자 (07)
\e ASCII 의 escape 문자 (033)
\n 개행문자 (줄바꿈)
\v 사용중인 bash 의 버전
\V 사용중인 bash 의 배포, 버전+패치수준으로 버전을 상세히 표시함
\r Carrage retrun
\nnn 8진수 nnn 에 해당하는 문자

필자는 사용자이름(\u), @ 현재 디렉토리(\W) 만 보여주고 싶어 설정 해 보았다.

export PS1="\u@\h@\W > "

무미 건조해서 설정값에 컬러를 넣어주었다.

 

프롬프트 색상코드

나는 Cyan, Green, Yellow 그리고 그냥 화면에서는 흰색을 위해 0으로 설정해주었다.

 

프롬프트 변수 설정 예시

export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\h@\[\e[33;1m\]\W >\[\e[0m\]"

색설정에 대한 옵션을 외울 필요는 없다.

프롬프트 설정은 이 정도로 마무리하고,

이제 그만 기본 문법을 살펴보자.

 

 

Shell 기본 문법

Shell은 인터렉티브하게 대화식으로 CMD에서 명령어를 입력하여 사용하기도 하지만,

프로그래밍하여 .sh 실행파일을 생성하여 논 인터렉티브하게 사용하기도 한다.

 

작성 기본 상식

1. 최상단에 #!/bin/bash 추가

- sh파일을 작성할때는 반드시 최상단에  #!/bin/bash 기록해줘야 해당 Shell을 통해 실행한다.

 

2. Shell 파일 실행 방법 ( ./ )

- sh / source / . 등을 이용해서 실행하면 권한이 없어도 수행이 가능하지만, ./ 로는 권한없이 수행이 불가하다

sh 파일명.sh 

. 파일명.sh   

source 파일명.sh    

./파일명.sh  # 기본적으로 권한이 없는 파일은 수행시킬수 없다.

 

3. 주석#을 이용한다.

 

4. 출력echo,  printf, read(C에서 Scanf와 같음, 입력을 기다림) 등을 이용한다 

#!/bin/bash
a=10
echo "hi echo 자동개행이되는구나$a"
printf "hi printf 개행을 해줘야하는구나 %d\n" $a

 

5. if 블록은 fi로 끝난다.

#!/bin/bash

num=7

if (( ${num} == 7 )); then
        echo "equal!"
else
        echo "non equal"
fi

비교 연산자 의미
-eq 같음
-ne 같지 않음
-gt 더 큼
-ge 크거나 같음
-lt 더 작음
-le 더 작거나 같음
-z 문자열이 null인가?
-n 문자열이 null이 아님
-a 논리 and
-o 논리 or

 

6. for문은 do 반복수행문, done으로 끝난다

arr=("a" "b" "c" "ddd") # 배열변수 선언 , 띄어쓰기 주의

for x in ${arr[@]}; do 	# arr에 @는 모든 원소를 의미, i로 받아옴
	echo $x
done

 

7. 변수에 타입은 없으며, 선언을 제외하고 사용시 $를 붙인다.

 

8. 기본변수로 $0실행 파일명을 가지며, $# 파라미터 갯수를 가지며,  $$ 프로세스ID를 나타낸다.

#!/bin/bash
echo "기본변수 "
echo "\$$ : " $$
echo "\$0 : " $0
echo "\$# : " $#

 

9. 실행시 매개변수는 들어온 순서대로 $1 ~ $999 까지 사용가능하며, $* , $@을 통해 한번에 받을수 있다.

 

10. 산술연사는 `를 감싸 expr로 표현한다.

#!/bin/bash
a=$1
b=$2
c=$3
echo $1
echo b + c = `expr $b + $c` # `이거로 감싸줘야 연산이 됨
echo "\$@ :"$@
echo "\$* :"$*

실행시 매개변수 3개이상 주어야 함 a,b,c에서 받음

 

 

 

이상 Shell 의 기본문법에 대해서 정리해보았습니다.

좀더 추가적이고 상세한 문법은 아래 블로그를 참조해주세요.

더보기