linux class 2 페이지

본문 바로가기
사이트 내 전체검색


회원로그인

linux class

shell 및 shell script

페이지 정보

작성자 admin 작성일15-12-23 15:17 조회230회 댓글0건

본문

Shell


사용자와 Unix 커널사이의 인터페이스 역할을 하는 프로그램.
사용자가 내린 명령어를 해석하여 커널에게 전달하는 역할을 한다
 명령어 해석기로도 불린다.

shell 의 역할
- 입력을 읽고 해당 명령행을 분석
- 특수문자 평가
- 파이프, 리디렉션, 백그라운드 프로세스를 처리

unix 주요 shell

1.bash(bourne again shell) : 리눅스의 기본셀. 편리한 사용자 인터페이스 및 본셀과 비교하여 확장된 문법제공.
본셀과는 기본적으로 호환됨. 명령행 편집기능 제공. GNU 프로젝트에 의해 만들어지고 배포됨.

2. sh(bourne shell) : steven bourne 이 개발한 최초의 대중화 된 유닉스 셀
 명령행 편집기능을 제공하지 않는다.

3.csh(c shell) : billy joy에 의해 개발된 셀로 프로그래머들이 선호하는 셀.
linux 의 기본셀인 본셀과는 호환되지 않는다.

4. ksh(korn shell) : david korn이 개발. 사용자 인터페이스가 뛰어나고 본셀과도호환되어 유닉스에서 가장 많이
  사용하는 셀로 알려짐  명령행 편집기능 제공.

*. shell (login shell인경우)설정 파일.

bash shell

로그인 셀이 bash 인경우 로그인하면
 /etc/profile => $HOME/.bash_profile => .bashrc => /etc/bashrc file이  실행된다.

login shell 을 끝낼때 =>  $HOME/.bash_logout 그리고 bash shell 사용기록을 저장하는
$HOME/.bash_history 라는 파일이 실행된다

* bash shell 변수

환경변수

- 주로 대문자만 사용
- 미리 정의되어 있다.
- shell 환경을 편리하게 사용할 수 있게 env 명령어로 볼수 있다.
- sub shell에서도 사용.

사용자정의변수

- 사용자가 필요할때마다 임시로 만들어서 사용
- 주로 소문자만 사용
- 현재셀에서만 사용가능

shell 내장변수

- shell 에 내장되어 있다.
- 변수명이 특수문자나 숫자로 되어 있다.

$0 $1 .... $n  => 위치매개변수
$#  => 인수의 갯수
$* => 모든 인수
$@ => 모든 인수
$? => return value
 $$ => 현재 process id

조건 판단명령어

test - check file types and compare values


*. 아래는 참고사항입니다.
 ===============================================================

bash shell 문법
* 변수: 할당과 치환
a=375
hello=$a

* 변수를 초기화 할 때, = 양쪽에는 빈 칸이 들어가면 안 됩니다.
echo hello    # 변수 참조가 아니고 그냥 "hello"란 문자열입니다.
echo $hello
echo ${hello} # 위와 똑같습니다.
echo "$hello"
echo "${hello}"
echo
hello="A B  C  D"
echo $hello
echo "$hello"
echo '$hello'
hello=    # 널 값을 갖도록 세팅.
여러 변수들을 공백문자로 구분해서 한 줄에서 세트할 수 있습니다.
하지만 이렇게 하면 코드의 가독성이 떨어지고
다른 시스템으로 이식할 수가 없을 수도 있기 때문에 조심해서 써야 됩니다.
var1=variable1  var2=variable2  var3=variable3
numbers="one two three"
other_numbers="1 2 3"
# 변수에 공백문자가 들어 있다면 쿼팅을 해줘야 합니다.
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"
echo "uninitialized_variable = $uninitialized_variable"
# 초기화 안 된 변수는 널 값을 갖습니다(아무 값도 없습니다).

for a in 7 8 9 11
do
  echo -n "$a 입니다."
done

# 'read' 문에서(역시 일종의 할당임)
echo -n "a" 를 넣으세요."
read a
echo "a" 의 값은 이제 $a 입니다."

a=`echo Hello!`  # 'echo' 명령어의 결과를 'a' 로 할당
echo $a
a=`ls -l`        # 'ls -l' 명령어의 결과를 'a' 로 할당
echo $a

$(...) 기법을 써서 변수 할당하기(역따옴표(backquotes)보다 새로운 방법)
# /etc/rc.d/rc.local 에서 발췌
R=$(cat /etc/redhat-release)
arch=$(uname -m)


연산자

문자열비교

[string] : string이 빈 문자열이 아니라면 참
["string1" = "string2"] : 두 문자열이 같으면 참
[“string1" != "string1" ] : 두 문자열이 같지 않으면 참.
 [ -n "string" ] : 문자열이 null(빈 문자열) 이 아니라면 참.
 [ -z "string" ] : 문자열이 null(빈 문자열)이라면 참

산술비교

[ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참.
 [ expr1 -ne expr2 ] : 두 표현식 값이 않다면 참.
 [ expr1 -gt expr2 ] :  expr1 이 expr2 보다 크다면 참
[ expr1 -ge expr2 ] : expr1 이 expr2 보다 크거나 같으면 참
[ expr1 -lt expr2 ] : expr1 이 expr2 보다 작다면 참
[ expr1 -le expr2 ] : expr1 이 expr2 보다 작거나 같으면 참

파일조건

[ -b file ] : file이 block device file이면 참
[ -c file ] : file이 character device file 이면 참
[ -d file ] : file이 directory file이면 참
[ -f file ] : file이 정규파일이면 참
[ -r file ] : file이 읽기권한이면 참
[ -w file ] : file이 쓰기권한이면 참
[ -x file ] : file이 실행권한이면 참
[ -L file ] : file이 symbolic link file이면 참
[ -e file ] : file이 존재하면 참

2. if 구문.

 단순 if 문

if [ 조건 ]
then
    실행문장
fi

if ~else 문

if [ 조건 ]
then
    실행문장
else
    실행문장
fi

if ~ else if 문

if [ 조건 ]
then
    실행문장
elif [ 조건 ]
then
    실행문장
fi

다중 if 문
if [ 조건 ]
then
    if [ 조건 ]
    then
          실행문장
  fi
 fi

3. and list / or list

and list

실행문장 && 실행문장 && 실행문장 && ....


=> 참이 될 때까지 실행문장을 실행한다.

or list

실행문장 || 실행문장 || 실행문장 || ...

=> 실행문장이 거짓이 될 때까지 실행한다.

4. case 구문

case 변수 in
  패턴 | 패턴 | ... )
    문장 ;;
  패턴 | 패턴 | ...)
          문장;;
  *)  문장 ;;
esac

5. while 구문

단순 while 문

while [ 조건 ]
do
    실행문장
done

다중 while 문


while [ 조건 ]
do
    while [ 조건 ]
        do
            실행문장
        done
 done

ex)
 echo -n "input password : "
 read password1
 echo -n "retype password : "
 read password2

while [ "$passowrd" != "$password2" ]
 do
    echo "password miss match try again"
    read password2
 done
 ecoh "OK ! password Match complete"

6. until 구문


until [ 조건 ]
do
    실행문장
done

ex)

until who | grep "$1" > /dev/null
 do
    sleep 5
 done
 echo "user $1 just logged in"

6 for 문

단순for 문

for 변수 in list
 do
    실행문장
done

다중 for 문


for 변수 in list
 do
    for 변수 in list
    do
        실행문장
    done
 done

ex)

for string in "hello" "unix" "world"
 do
    echo -n "$string "
 done

7. select 문.
select 변수 in list
 do
    실행문장
done

8. 함수

함수명 () {
    실행문장
    [ return value ]
 }

또는

function 함수명 {
    실행문장
    [ return value ]
 }

break / continue

break 제어문이나 조건문의 루프를 빠져나갈 때 사용한다.
continue : 제어문이나 조건문의 처음으로 돌아가서 다시 수행한다.
 :  의미 없는 명령. 논리 값 true를 대신해서 쓰기도 한다.

. 명령 - 스크립트를 실행. 스크립트 내에서 다른 파일을 include하는 경우에도 사용

exec - 현재 shell을 다른 shell 로 대체
exit n : 현재 shell 종료 시 리턴 값 n 반환
shift : shell의 인자를 오른쪽으로 하나 shift 한다.

ex)

echo $1
 shift
 echo $1
 shift 3
 echo $1

./script 1 2 3 4 5 6 7

1
 2
 5

정규표현식


정규표현식
정규 표현식이란 어떤 문자열의 집합을 표시하는 텍스트 스트링을 말하는 것으로 일반적으로
텍스트 형식 문서등에서 문자열을 찾아내고 치환하는데 많이 사용된다.
정규 표현식은 vi.ex,ed,sed,grep 등에서 사용되며 윈도우의 찾기 기능이나 바꾸기 기능과는 비교할
수 없는 편리함이나 강력한 기능을 갖고 있다.

“[문자열]”의 의미
정규 표현식에서 문자열이 “[ ]"로 둘러싸여 있으면 이문자열들중 하나를 의미하게 된다.
ex [0-9] : 숫자 한글자
  [a-z] : 소문자 한글자
[A-Z] : 대문자 한글자
[a-zA-Z] : 대소문자 관계없이 한글자
[Oo]wl : Owl 또는 owl  그러나 Oowl 은 해당되지 않는다.

"[ ]"안에서 “^”는 문자열중 ^이하를 포함하지 않는 문자열을 말한다.
 ex) [^0-9] : 숫자가 아닌 문자 하나를 의미한다.
    [-0-9] : 숫자 한 개 또는 - 기호를 의미한다.
    [^-0-9] : 숫자나 - 기호가 아닌 문자 하나를 의미한다
    [^A-Z] : 대문자를 제외한 문자
    c[a-z0-9]t : 두 번째 문자가 임의의 소문자나 숫자.

“^”와 $의 의미
“^”는 라인의 시작 부분을 의미하는 것인 반면 “$”는 라인의 끝 부분을 의미한다. 만약 “new"로
시작하는 부분을 찾고 싶다면 ”^new"라고 표현한다.

“\”
정규표현식에서는 특별한 의미를 지니고 있는 <>,()등의  기호들의 표현하기 위해 해당 문자의 바로
앞에 역슬래시를 사용하여 구분한다.
ex) \$$ : $로 끝나는 라인을 의미한다.
 
“.” : 아무문자나 한 개의 문자를 의미.

ex) [0-9]* : 숫자가 들어 있거나 그렇지 않은 부분을 의미.

확장 정규식
+ : + 기호 바로 이전의 글자나 정규식이 1회이상 반복 
ex. abc+ (c가 1회이상 반복) ==> abc, abcc, abcc 등
? : ? 기호 바로 이전의 글자나 정규식이 없거나 한번 존재
ex. abc? (c가 있거나 없거나) ==> ab,abc
( ) : 부분 정규식의 시작과 끝을 표시
ex. a(bc)* (bc가 0회 이상 반복) ==> a, abc, abcbc등
    a(bc)+ (bc가 1회 이상반복) ==> abc,abcc등
    a(bc)? (bc가 있거나 없거나) ==> a, abc 등
| (  ) 내의 단어들 중 최소 하나가 존재
ex. a(b|c) (b 또는 c가 최소 하나 존재 : ab, ac, abc, acb)

*. 텍스트 조작 및 필터명령
grep(get regular expression)
: 특정한 문자열을 포함하고 있는 라인을 찾기위해 사용한다.
자주사용되는 옵션
-v(invert) ; 찾고자 하는 문자열과 일치하는 라인을 제외한 모든 라인을 출력한다.
-n(number) ; 문자열이나 패턴을 일치시키는 라인들의 라인번호를 표시해준다.
-l(listfile) ; 특정한 패턴을 찾기위해 여러개의 파일을 검색할 때 편리하게 사용할 수 있다.
이 옵션은 패턴을 갖고 있는 줄을 찾아 보여주는 것이 아니라 그러한 줄이 발견된 파일명을 결과로
보여준다.

egrep(Extended grep) : 확장 정규식을 사용해서 grep 명령어로 표현할 수 없는 다양한 패턴을 나타낼
 수 있다.

fgrep(Fixed grep) : grep, egrep 명령어와 달리 정규식을 전혀 사용하지 않는다. 모든 패턴의 문자를
그대로 인식하므로 *, +, ^, $, [ ] 등의 문자도 모두 단순 문자로서만 인식한다.

********************************************************************************
AWK
자료 처리 및 리포트 생성에 사용되는 프로그래밍 언어
입력데이트로는 표준입력, 파일, 프로세스의 결과를 사용할수 있다.

awk 'pattern' 파일명
awk '{action}' 파일명
awk 'pattern {action}' 파일명

awk '/root/' /etc/group  ; root 문자가 포함된 행 출력
awk '/^root/' /etc/passwd ; root 문자로 시작하는 행 출력
awk '/(root)|(apache)/' /etc/passwd  ; root 또는 apache 문자가 포함된 행 출력

awk '{print $1,$2}' /etc/hosts  ; 첫번째 필드, 두번째 필드 출력(필드구분자는 빈칸)
awk -F: '{print $1,$7}' /etc/passwd ; 첫번째, 일곱번째 필드출력(필드구분자는 콜론)
awk -F: '$3 < 10' /etc/passwd ; 세번째 필드가 10보다 작은행 출력

*. match 연산자(~)
- 특정 레코드나 필드내에서 일치하는 정규표현식 패턴이 존재하는지 검사.
awk -F: '$5 ~ /[aA]pache/' /etc/passwd ; 다섯번째 필드에 apache 또는 Apache 문자가 포함된 행 출력

관계연산자 및 산술연산자를 사용할 수 있다.
---------------------------------------------------------------------
 awk -F: '$3 < 10 {print $1,$3}' /etc/passwd
 awk -F: '$3 > 10 && $3 <=20 {print $1,$3}' /etc/passwd
 awk -F: '$3 == 0 {print $1,$3}' /etc/passwd
 awk -F: '/root/'{print $1, $3, $+10}' /etc/passwd
 awk -F: '/root/'{count +=1 ; print count}' /etc/passwd
 awk -F: '/root/{count +=1; print $1,count}' /etc/passwd
---------------------------------------------------------------------
*. 필드 구분자가 탭인경우는
awk -F '[\t]'

AWK 변수
NR 변수 : 한개의 레코드를 처리한후 1이 증가하는 변수
NF 변수 : 필드의 갯수를 출력하는 변수

awk -F: '{print NR,$1}' /etc/group
awk '{print NF,$1}' /etc/issue
********************************************************************************
sed(streamlined editor)
- 대화형기능없음
- 원본을 수정하지 않고 편집결과는 표준출력으로 출력한다

sed -n '1,3p' /etc/passwd
 sed -n '/root/p' /etc/passwd
 sed '/root/p' /etc/passwd  ; 찾는문자열은 두번 출력하고 나머지는 그대로 출력.
 sed '1,10d' /etc/group ; 1~10행 삭제
sed '$d' /etc/issue ; 마지막 행 삭제
sed 's/root/ROOT/g' /etc/passwd
sed  's/CentOS/centos/g' /etc/issue
 sed  -n '10,/^[aA]pache/p' /etc/passwd

댓글목록

등록된 댓글이 없습니다.


접속자집계

오늘
129
어제
66
최대
611
전체
453,410
개인정보취급방침 서비스이용약관 twoseven.kr All rights reserved.
상단으로