본문 바로가기
생활

쉘 및 쉘 스크립트 정리

by _BlankSpace 2016. 7. 8.

shell 은 운영체제의 커널과 사용자 사이를 이어주는 역할을 한다.



Bourne Shell (sh)
- 오리지널 유닉스 쉘
- AT&T Bell 연구소에서 개발
- root의 기본 Shell


C Shell (csh)

- 1976년에 개발
- C 언어 기반으로 개발
- BSD 계열에서 많이사용
- 근대적인 shell의 시초
- 사용자의 편의성을 제공


Korn Shell (ksh)

- Bourne Shell의 기능 추가 버전
- Bourne Shell + 사용자 편의 기능


Bash

- linux에서 주로 사용
- Korn + C Shell의 장점을 추가
- 방향키를 사용 가능
- 색상을 지원


쉘 스크립트
장점
- 만들기 쉬워
- 이식성이 좋다
- 컴파일을 하지 않아도 됨

단점
- 컴파일된 파일에 비해 속도가 늦음



shell command
# sh test_name


error
# sh -x test_name
# sh -v test_name

 

옵션 설명
-v 에러메세지가 발생한 라인을 출력한다.
-x 각각의 명령이 일어나는 부분을 출력하여준다.



# 다중 명령어 사용(; , && , ||)


1) 세미콜론(;)

 - 하나의 명령어 라인에서 여러 개의 명령을 실행(하나의 명령어 다음에 추가)
 - 첫 번째 명령이 실패하여도 두 번째 명령은 반드시 실행이 됨.

[root@secondary ~]# printf "first command\n"; printf "second command\n"
first command
second command

[root@secondary ~]# linux; date
-bash: linux: command not found
2013. 09. 04. (수) 11:21:39 KST


2) 더블 엠퍼센드(&&)
 - 첫 번째 명령이 에러 없이 정상적으로 종료했을 경우에만 두 번째 명령을 수행

[root@secondary ~]# date 'test' && printf "second command\n"
date: invalid date `test'

[root@secondary ~]# date && printf "second command\n"
2013. 09. 04. (수) 11:35:22 KST
second command


3) 더블 버티칼바(||)
 - 첫 번째 명령의 결과에서 에러가 발생하더라도 각각의 모든 명령을 수행

[root@secondary ~]# date 'test' || printf "second command\n"
date: invalid date `test'
second command


> 3가지 연속적 사용

[root@secondary ~]# test1; date 'test' || printf "second command\n" && printf "third command\n"; printf "last command\n"
-bash: test1: command not found
date: invalid date `test'
second command
third command
last command


> 명령어 라인을 두번 실행(!#)

[root@secondary ~]# date; !#
date; date;                     -- 변환된 명령어 라인
2013. 09. 04. (수) 11:45:15 KST
2013. 09. 04. (수) 11:45:15 KST

[root@secondary ~]# date; date;
2013. 09. 04. (수) 11:45:32 KST
2013. 09. 04. (수) 11:45:32 KST


date 명령을 수행한다음 2초후 date 명령을 한 번 더 실행

[root@secondary ~]# date; sleep 2; !#
date; sleep 2; date; sleep 2;      -- 변환된 명령어 라인
2013. 09. 04. (수) 11:46:26 KST
2013. 09. 04. (수) 11:46:28 KST



# 명령 반복 실행

while true; do [실행할 명령]; sleep [반복단위:초]; done;

2초 간격 시스템 용량확인(df -k) 명령 실행

[root@secondary ~]# while true; do df -k; sleep 2; done;




 정규 표현식(정규식, regular expression)에서 메타 문자(meta character)들은 특별한 뜻이 담기어 문자열 양식을 나타내는 데에 쓰인다. 아래에 특수기호로 나타내는 메타 문자의 뜻과 정규 표현식에 맞는 문자열의 보기를 정리하였다.

1) ^

  • 문자열의 처음을 나타냄
맞는 문자열
^group group으로 시작하는 문자열 group, groups, group program, 

2) $

  • 문자열의 끝을 나타냄
맞는 문자열
ing$ ing로 끝나는 문자열 ing, sing, hosting, booting, 
^code$ code로 시작하고 끝남 code

3) .

  • 임의의 한 문자를 나타냄
맞는 문자열
a.b a와 b 사이에 한 문자가 낀 문자열 aab, abb, acb, 
ab. ab 다음에 한 문자가 붙은 문자열 aba, abb, abc, 
a..b a와 b 사이에 두 문자가 낀 문자열 a11a, aabb, abbb, 
^.ape ape 앞에 한 문자가 낀 문자열로 시작함 tape, caper, 


4) *

  • 바로 앞의 문자가 없거나 하나 이상 있음
맞는 문자열
m*r r 앞에 m이 없거나 하나 이상 있음 r, mr, mmr, mmmr, 
mr*s m 다음에 r이 없거나 하나 이상 있고 s가 맨 뒤에 있음 ms, mrs, mrrs, mrrrs, 
mrs* mr 다음에 s가 없거나 하나 이상 있음 mr, mrs, mrss, mrsss, 

5) +

  • 바로 앞의 문자가 하나 이상 있음
맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, 
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, 
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, 


6) ?

  • 앞의 문자가 없거나 하나임
맞는 문자열
ws?p w와 p 사이에 s가 하나 있거나 없음 wp, wsp

7) [ ] (꺾쇠묶음, 대괄호)

  • 꺾쇠묶음는 한 문자를 가리킴
  • 묶음 안의 내용은 가리키는 문자의 범위를 나타냄 (문자 클래스로서 정규 표현식과는 언어과 다름)
  • 특정한 문자열을 제외하려면 묶음 안에서 '^'를 씀
맞는 문자열
[w]s s 앞에 w가 붙음 ws
[ws]p p 앞에 w나 s가 붙음 wp, sp
[a-z]8 8 앞에 잔 로마자(소문자) 하나가 붙음 a8, b8, c8,  , z8
[a-zA-z][0-9] 로마자 하나 뒤에 숫자 하나가 붙음 a0, b5, K3, 
[^w]s s 바로 앞에 w가 아닌 문자 하나가 붙음 as, 2s, es, 
[^ws]p p 바로 앞에 w나 s가 아닌 문자 하나가 붙음 ap, hp, op, 
[^a-z]8 8 바로 앞에 잔 로마자가 아닌 문자 하나가 붙음 A8, C8, 38, #8, 
^[^gh][^ij]$ g나 h가 아닌 한 문자로 시작하고  i나 j가 아닌 한 문자로 끝남
(꺾쇠묶음 밖의 ^는 문자열의 처음을 나타냄)
ab, ty, ig, jh, 

8) { } (활짱묶음, 중괄호)

  • 활짱묶음은 앞에 있는 문자의 개수를 나타냄
  • 묶음 안에서 ','는 문자 개수의 범위를 나타낼 때 씀
맞는 문자열
w{0}s s 앞에 w가 없음 s
w{1}s s 앞에 w가 하나 붙음 ws
ws{3}p w가 앞에 오고 s가 셋 붙으면서 p가 뒤에 붙음 wsssp
w{1,3}s s 앞에 w가 1~3개 붙음 ws, wws, wwws
w{,2}s s 앞에 w가 두 개 이하 붙음 s, ws, wws
w{2,}s s 앞에 w가 두 개 이상 붙음 wss, wsss, 

9) ( ) (손톱묶음, 소괄호)

  • 손톱묶음 안의 문자열은 하나로 묶어서 다룸
맞는 문자열
(ws)p p 앞에 ws가 붙음 s
(ws){2}p s 앞에 ws가 두 번 붙음 wswsp
[^(web)]p p 앞에 web이 아닌 문자나 문자열이 옴 ap, zzp, wp, wep, webpp, 


10) | (위아랫금, 수직선)

  • '또는', 'or'과 같은 뜻으로 선택문에 쓰임
맞는 문자열
word|phrase word 또는 phrase word, phrase
mount(ed|ing) mounted 또는 mounting mounted, mounting
[^(a|b|c)].+ a 또는 b 또는 c로 시작하지 않는 문자열  

11) \ (거꿀빗금)

  • 메타 문자의 성질을 없앨 때 붙임
맞는 문자열
\[[^\[\]]+\] 꺾쇠묶음으로 싸인 문자열 [a], [ab], [abc], 
[^\.]+\.(com|net) com, net로 끝나는 바탕 도메인 이름 a.com, b.net, 

+추가

정규표현식
- 검색에 사용되는 여러 문자들의 패턴
- vi, vim, grep, sed, awk 등에서 상용

 

^ : 줄의 시작('^Pattern')
$ : 줄의 끝 ('Pattern$')
/< : 단어의 시작 ('/<love')
/> : 단어의 끝 ('love/>')
. : 하나의 문자가 일치 ('p.....n')
* : 모든 문자 ('[a-z]*')
.* : 모든 문자 ('a.*')
[] : 해당되는 문자 ('[Pp]attern')
[x-y] : 범위안의 문자 '[a-z]attern')
[^x-y] : 범위안에 해당하지 않는 문자 ('[^a-c]attern')












인용의 사용

 > Single Quotes(' ')   : - tab과 같은공백을 일반 문자로 인식

                                - 모든 문자를 일반 문자로 인식

 > Double Quotes(" ") : 대부분의 특수 문자들을 보호

- tab과 같은공백을 일반 문자로 인식
- `, $, \, ' 예외

 > Backslash(\)        : 다음에 나오는 문자의 특별한 의미를 제거

 > Back Quotes(`)      : 명령어 대체(command substitution)

 > Dollar sign($)        : 쉘 변수



Redirection
0 < : 기본 input (키보드)
1 > : 기본 output (모니터)
2 > : 기본 error (모니터)
2 > & 1 : 기본에러의 출력 방향을 기본 입력과 같도록 설정
2 > /dev/null


pipe
ex) who | wc
- who 실행결과를 stout으로 출력
- pipe는 앞 명령어의 표준 출력을 뒤 명령어의 표준 입력으로 전달
- wc는 파이프라인을 통해 who 명령어의 표준출력을 표준 입력으로 사용
- Redirection을 통해 who의 실행결과를 wc로 넘기기 위해서 중간단계의 파일이 필요하나 파이프를 사용할 경우 중간 단계의 파일이 생성되지 않음


----------------------------------------------------------------------


grep 
- file에 내용이 포함된 문자를 검색
- 패턴, 정규표현식
- 검색된 라인을 화면에 표시
- 바이너리 파일, 어플리케이션 데이터는 검색이 불가
grep -옵션 패턴 filename

 

옵션
-i : 대소문자 구별하지 않음 --ignore-case 
-l : 패턴이 있는 파일 이름만 출력하고 라인은 출력하지 않음  --files-with-matches
-n : 출력하는 각 라인 앞에 번호를 붙임. --line-number :
-v : 패턴이 없는 라인만 출력
-c : 패턴이 있는 라인의 수
-w : 패턴과 맞는 단어가 독립적인 경우만 출력

 

/etc/group에서 root가 있는 라인 숫자를 찾아라!!
/etc/group에서 root가 없는 라인 숫자를 찾아라!!


egrep
- grep의 확장 버전
- file의 내용을 검색
- 정규식/확장 정규식
- 검색된 라인을 화면에 출력
- 파일의 내용에는 영향이 없음

 

옵션
-i : 대소문자 구별하지 않음
-l : 패턴이 있는 파일 이름만 출력하고 라인은 출력하지 않음
-n : 출력하는 각 라인 앞에 번호를 붙임.
-v : 패턴이 없는 라인만 출력
-c : 패턴이 있는 라인의 수
-w : 패턴과 맞는 단어가 독립적인 경우만 출력

 

+ :a-z 문자로 시작하고 끝에 단어가 ask로 끝나는 단어를 출력, [a-z]+ask
x|y : 레드거나 그린인 라인을 출력, red | green
? : 앞의 문자가 1개 있는 또는 없는 라인을 출력 ,a?
(|) : searches 이거나 searching 이 포함된 라인 출력, search (es|ing)

 


fgrep 
- 정규표현식, 확장 정규표현식을 사용하지 않아요
- 문자 그대로를 인식하여 출력


실습시나리오 (grep, egrep, fgrep)
1. sam을 포함하고 있는 모든 줄을 출력

grep sam* sam
2. 사람의 이름이 J로 시작하는 모든 줄을 출력

grep -i ^j name
3. 700으로 끝나는 모든 줄을 출력

grep '.700' name
4. 834를 포함하지 않는 모든 줄 출력

grep -v '.700' name
5. 생일 7월인 모든 줄을 출력

grep "....-7" birth
6. 전화번호의 지역코드가 031인 모든 줄을 출력

grep ^031 phone

grep 031$ phone


^는 시작 $는 끝



7. 대문자 하나, 이어서 4개의 소문자, 콤마, 스페이스에 하나의 대문자를 포함하는 모든 줄을 출력

grep "[A-Z][a-z][a-z][a-z][a-z], [A-Z]" name


8. 성이 K나 k로 시작하는 모든 줄을 출력

 grep -i ^k name


정규표현식을 이용한 실습
1. ID@도메인 형태로 이루어진 e-mail을 검색 할 수 있는 정규 표현식작성
2. 핸드폰 번호를 검색 할 수 있는 정규 표현식 작성
3. ip주소를 검색 할 수 있는 정규표현식 작성







반복문!도 공부해야됌


http://blog.daum.net/_blog/BlogTypeView.do?blogid=0JHcJ&articleno=8382770&categoryId=267754&regdt=20130716235124


#!/bin/sh

echo "Enter a number between 1 and 10. "
read NUM

case $NUM in
	1) echo "one" ;;
	2) echo "two" ;;
	3) echo "three" ;;
	4) echo "four" ;;
	5) echo "five" ;;
	6) echo "six" ;;
	7) echo "seven" ;;
	8) echo "eight" ;;
	9) echo "nine" ;;
	10) echo "ten" ;;
	*) echo "INVALID NUMBER!" ;;
esac


#!/bin/bash

PS3='제일 좋아하는 야채를 고르세요: ' # 프롬프트 문자열 세트.

echo

select vegetable in "콩" "당근" "감자" "양파" "순무"
do
  echo
  echo "제일 좋아하는 야채가 $vegetable 이네요."
  echo "깔깔~~"
  echo
  break  # 여기에 'break'가 없으면 무한 루프를 돕니다.
done

exit 0





댓글