728x90

shell

- 리눅스 운영체제의 명령어 해석기

- 해당 프로그램 실행, 리눅스 커널에 작업 요청

 

쉘 프로그래밍

- 시스템 관리작업 실시나 특정 작업을 한꺼번에 순차적으로 처리

-> 시스템에 필요한 환경변수 사전 설정

-> 응용 프로그램 실행에 필요한 설정 작업

 

(1) 쉘 개요

1) 쉘 개요

2) 리눅스 쉘

3) 프로그램 표준 스트림

4) 리눅스 쉘의 특수 기능

 

1) 쉘 개요

쉘 이란

- 사용자의 명령어를 시스템 커널에 전달 -> 명령어 해석기

- 사용자와 리눅스 사이 인터페이스 제공 프로그램

- 사용자가 shell을 통해 입력한 명령어들을 운영체제가 실행

- 리눅스는 여러 shell을 동시 사용 가능

- 커널 : 운영체제의 핵심

- X window : 사용자 그래픽 인터페이스

- ohter program : 사용자 응용프로그램

- csh, bash : 사용자가 입력한 명령어를 해석하여 필요한 작업 실행 또는 운영체제에 요청

 

유닉스 쉘

- sh Bourn shell : AT&T 의 스테판 본이 개발

- csh  C shell : 버클리 대 빌 조이가 개발

- ksh  korn shell : 데이비드 콘이 개발

- bash bourn-again shell : GNU 프로젝트 쉘

 

쉘 설정파일

- sh, ksh : ~/.profile

- csh : ~/.cshrc

- bash : ~/.bash_profile

- 쉘 사용에 필요한 각종 환경변수, 실행파일 탐색장소, 동작과 외형 등 제어하는 스크립트가 저장

 

2) 리눅스 쉘

- 리눅스 기본 쉘 : bash 

- 리눅스 기본 쉘 지정 : /bin/sh -> link -> /bin/bash 가 실행

    - 기본 쉘을 bash에서 csh로 변경시 -> link -> /bin/csh로 설정

 

bash 쉘 설정파일

- 환경변수, 쉘 명령어,, 쉘스크립트 등 포함

1. /etc/profile : 모든 bash 쉘 사용자에게 적용. 로그인 쉘에 적용

2. ~/.bash_profile : 특정 사용자에게만 적용

 

로그인 쉘

- 사용자가 로그인시 실행되는 쉘 프로그램

 

3) 프로그램 표준 스트림

표준 입력 스트림 -> 프로그램 -> 표준 출력 스트림

                                        -> 표준 에러 스트림

- 표준 이름 스트림 stdin : 키보드

- 표준 출력 스트림 stdout : 모니터. 파일 디스크립터번호 1

- 표준 에러 스트림 stderr : 모니터. 파일 디스크립터번호 2

 

4) 리눅스 쉘의 특수기능

- redirection : 프로그램 입출력 스트림 방향을 파일로 변경

    > 문자 : 표준 출력 스트림을 파일로 변경, 덮어쓰기

    < 문자 : 표준 입력 스트림을 파일로 변경

   >> 문자 : 표준 출력 스트림을 파일로 변경, 파일 끝에 추가

   << 문자 : 표준 입력 스트림을 스트림 리터럴로 변경 - 키보드 입력을 스트림으로 생성

   <<< 문자 : 표준 입력 스트림을 문자열로 변경

 

pipe

- 프로그램 출력을 다른 프로그램 입력으로 사용

- 여러 개 프로그램을 파이프로 연결하여 작업 메모리 공간 절약

- 파이프로 연결된 2개 프로그램은 데이터 스트림이 가용상태면 동시에 실행 가능.  2개의 프로그램 사이 데이터 흐름 제어

- 파이프 연산자 | 로 사용

ex) $ program1 | program2 | program3

- 프로그램1의 출력을 프로그램2 입력으로 사용. 프로그램 2의 출력을 프로그램 3의 입력으로 사용

 

filter

- 파이프와 함께 사용됨. 표준 입력스트림을 처리하여 표준 출력스트림으로 출력

- sort : 정렬하여 출력

- uniq : 중복 라인 제거

- grep : 특정 문자열 패턴을 찾아 출력

- fmt : 포맷해서 출력

- tr : 대소문자, 파일형식 변환

- sed : 스트림 편집기 사용

- awk : 문자열 패턴 검색 및 조작에 사용

 

expansion

- 특수 문자를 사용하여 문자열 패턴 확장

- 글로빙 : 와일드 카드를 사용하여 문자열 패턴 확장

- * : 해당 위치에 있는 모든 크기 문자

- ? : 해당 문자에 있는 크기가 1인 모든 문자열

- [123] : 1또는 2또는 3 한문자를 포함하는 모든 문자열

- [^123] : 1,2,3을 포함하지 않은 모든 문자열

 

추가 확장

- Brace 확장 : a{1, 2, 3} -> a1,a2,a3 한 문자를 포함하는 3개의 문자열

- Tilt 확장 : 현재 사용자의 홈 디렉토리 이름. cd 시 홈으로 이동

- 파라미터 확장 : $AAA -> 쉘 환경변수 AAA 값으로 확장

- 산술 연산 확장 : $((2+2)) -> 4

- 명령어 확장 : $(명령어) or `명령어` : $echo $(ls a?b) -> afb

- single quote 확장 : '문자열' 문자열 유지. 문자열 내 확장 문자 있어도 무시

- double quote 확장 : "문자열" : 파라미터 확장, 산술연산 확장, 명령어 확장이 포함시 확장 적용. 나머지 확장은 무시

 

(2) 쉘 스크립트

1) 쉘 스크립트 개요

2) 쉘 스크립트 작성절차

3) 쉘 스크립트 디버깅

4) 쉘 스크립트 문법

 

1) 쉘 스크립트

 쉘 스크립트

- 쉘이 실행할수 있는 명령어와 문법으로 만든 프로그램 파일

- 용도 : 사용자 입력/파일로 부터 읽은 데이터를 처리해 출력하는 작업. 반복적 작업 실행 자동화. 배치처리

- 실행 방법 : 쉘 스크립트 파일 직접 실행 or 파일 작성해서 순차적 실행

 

2) 쉘 스크립트 작성절차

- 문서 편집기 사용하여 편집

- 스크립트 파일 확장자 -> sh

- 스크립트 첫라인 첫 번째 문자 #! (쉬뱅)*       // #!이 쉬뱅. 이는 스크립트 파일임을 알려줌

- 쉬뱅 다음에 스크립트를 실행할 해석 프로그램 지정

- 실행 성공을 표시하기 위해 마지막에 exit 0 추가

 

예시

#! /bash/sh

exit 0

 

실행 방법

1. 쉘 스크립트 직접 실행 sh 파일명

2. 실행 권한 설정 : 실행 권한 부여후 ./파일명

3. 스크립트 실행 경로 설정 : export PATH=$PATH:.  -> ./파일명

 

 

3) 쉘 스크립트 디버깅

- 비교적 용이하여 별도 디버깅 툴 없음

- 에러 발생시 쉘은 에러를 포함하는 스크립트 라인번호 출력

- echo를 사용하여 변수값 출력하면서 코드 테스트

- 복잡한 에러 추적은 쉘 옵션 사용

-n : 명령어 실행하지 않고 문법만 검사

-v : 명령어 실행전 출력

-x : 실행시 자세한 인자, 명령어, 변수 출력

-u : 정의하지 않은 변수 사용시 에러 출력

-e : 오류 발생시 실행 중지

ex) sh -xv hello.sh

 

4) 쉘 스크립트 문법

변수 : 대소문자 구분, 문자열료 표현, 값 정의는 "=" 사용

- 변수값 참조시 변수명앞에 $사용

- 변수값 출력시 echo. 사용자 입력값을 변수에 할당시 "read" 명령어 사용

 

환경 변수

- 쉘 실행환경과 관련된 사전에 정의된 쉘 변수

- 쉘 스크립트 시작시 초기화

- 환경 변수 확인 -> "env" 명령어 사용

- 쉘 변수를 환경변수로 전환 : export 변수명

 

환경변수 예시

- $HOME : 홈디렉토리

- $PATH :명령어 탐색경로

- $PS1 : 명령어 프롬프트

- $IFS : 필드 구분자 리스트

- $0 : 쉘스크립트 파일이름

- $# : 쉘스크립트에 전달되는 파라미터 수

- $$ : 쉘스크립트의 process id

- $* : IFS 환경 변수의 첫번째 구분자를 사용하여 모든 파라미터를 1개의 변수로 표현

- $@ : IFS를 사용하지 않는 "$*"

Test 명령어

- 쉘에서 사용하는 조건 명령어

- "test" 또는 '[' ']' 사용

- 테스트 조건 등 검사한 후 그 결과를 참 또는 거짓값을 반환

- 아래는 foo.c 라는 파일의 존재 여부를 검사

if test -f foo.c

  then

to do something

  fi

 

if [ -f foo.c ]

  then

to do something

  fi

 

test 명령어로 사용할수 있는 조건 유형

- 문자열 비교 : string1 = string2/ -n string 문자열이 널이 아니면 참/ -z string 문자열이 널이면 참

- 수식 비교 : exp1 -eq ex2 두 표현식이 동일하면 참/ exp1 -gt exp2 exp1이 exp2보다 크면 참

- 파일 존재여부 : -d file 파일이 디렉토리인지 검사/ -e file 파일이 있으면 참 / -f file 파일이 일반파일이면 참 /

               -g file에 그룹 id가 설정시 참 / -r file 파일을 읽을수 있으면 참 / -s file 파일 크기가 0이아니면 참

 

if 문

- 실행 조건을 테스트 해서 선택적 실행

- cond 에서는 test 명령어 사용

- if문 종료시 fi로 마침

if cond

then

  task1

else

  task2

fi

 

if 문을 사용한 예시 

- if와 then을 같은 라인에서 사용시 ;(세미콜론)을 사용해서 if의 test와 then을 분리해야함

#!/bin/sh

echo "hello world ! who u are?"

read name

if [name="momo"]; then

   echo "it's U"

else

   echo "Not U"

fi

exit 0

 

for 문

- 변수 값이 지정된 범위 내에서 변수값을 바꿔가면서 반복 실행

- 문법

for var in values

do

  task

done

- 예시

#!/bin/sh

for name in foo bar boo

do

  echo $name

done

exit 0

 

while 문

- 실행 조건을 테스트해서 결과가 거짓이 될때까지 반복 실행

- 문법

while cond do

  task

done

-사용 예

#!/bin/sh

echo "Enter name"

read myname

while ["$myname"!="momo"]; do

  echo "Sorry, not myname"

  read myname

done

exit 0

 

Until 문

- 조건을 테스트해서 결과가 거짓이 될때까지 반복.

- while과 반대

- 적어도 한번은 수행

- 문법

until cond

do

   task

done

- 사용예

#!/bin/sh

echo "start!"

icnt=10

until [$icnt -eq 12]

do

  echo $icnt

  icnt=`expr $icnt+1`

done

exit 0

 

case 문

- 변수 패턴을 검사하여, 패턴에 따라 다른작업 실행

- 문법

case variable in

pattern [|pattern] ...)

statements;;

pattern [|pattern] ...)

statement;;

esac  //case의 반대로

exit 0

- 사용예

#!/bin/sh

echo "Type your color"

read mycolor

case "$mycolor" in

  green|g* ) echo "GREEN";;

  red|r* ) echo "RED";;

  * ) echo "OTHERS";;

esac

exit 0

 

List 문

- 문장 또는 명령어들을 직렬로 연결하여 사용

- AND 리스트 : 연산자 &&, 앞 명령어 성공시 뒷 명령어 실행

- OR 리스트 : 연산자 ||. 앞명령어 실패시 다음명령어 실행

- 사용 예

#!/bin/sh

...

if [ -f myfile ] && echo "hello"

then

echo "AND list"

fi

...

if [ -f myfile ] || echo "hello"

then

echo "OR list"

fi

...

exit 0

 

쉘스크립트의 함수

- 문장 그룹에 이름을 붙여 함수로 정의해 사용가능

- 함수를 사용하여 스크립트 구조화 가능

- 함수 파라미터 전달 : 쉘 스크립트 파라미터 전달과 동일.

   첫번재 파라미터 $1, 파라미터 전체 문자 $@, 파라미터 수 $# 

- 함수 리턴 값: return 명령어 사용

- 함수 호출에서 리턴값을 $?으로 참조

- 포맷

fname (){

  task

}

 

function fname{

  task

}

- 사용예

#!/bin/bash

myadd(){

  sum=$(($1+$2))

  return $sum

}

op1=10

op2=20

myadd $op1 $op2

echo "sum:$?"

exit 0

300x250

+ Recent posts