1. bash 쉘의 특징

  • Alias 기능 (명령어 단축 기능) ==> alias <별명>='원래 명령어'
  • History 기능 (이전 명령어 보기) ==> history 명령어 또는 위/아래 화살표 
  • 연산 기능
  • Job Control 기능
  • 자동 이름 완성 기능 ==> Tab 키
  • 프롬프트 제어 기능
  • 명령 편집 기능
  • 환경 변수
    • 환경변수 확인 ==> echo $환경변수이름
    • 환경변수 설정 ==> export 환경변수이름=값
    • echo $PATH : 명령어가 실행되는 경로 (해당 경로 내의 명령어가 기본 명령어)

 

2. 쉘 스크립트 실행 방법

  • 쉘 스크립트 프로그래밍은 별도로 컴파일하지 않고 텍스트 파일 형태로 바로 실행된다.
  • 리눅스의 많은 부분이 쉘 스크립트로 작성되어 있다. (C언어와 유사)
  • 쉘 스크립트 파일의 확장명 : .sh
  • 쉘 스크립트 파일을 /usr/local/bin/ 디렉토리에 복사하고, 속성을 755로 변경해주면 모든 사용자가 스크립트를 사용할 수 있다. (이 작업은 보안상 root만 수행함)
  • 쉘 스크립트 실행하는 두 가지 방법
    • sh <스크립트 파일>
    • chmod +x <스크립트 파일> && ./<스크립트파일>

      ex) name.sh
      -------------------------------------------------------------------------
      #! /bin/sh --> bin 아래 쉘을 사용한다는 의미로 반드시 써주어야 한다.
      echo "사용자이름: " $USERNAME
      echo "호스트이름: " $HOSTNAME
      exit 0
      -------------------------------------------------------------------------
      ~$ sh name.sh
      ~$ chmod +x name.sh
      ~$ ./name.sh
    • 현재 디렉토리임을 명시해야 한다. 환경변수에 디렉토리경로가 없으므로 name.sh 만 입력할 경우 명령어 탐색 실패라고 뜬다.

 

3. 쉘 스크립트 - 변수

  • 변수를 사용하기 전에 미리 선언하지 않으며, 변수에 처음 값이 할당되면서 자동으로 변수가 생성된다.
  • 모든 변수는 문자열(String)로 취급
  • 변수 이름은 대소문자를 구분
  • 변수를 대입할 때 '=' 좌우에는 공백이 없어야 한다.
  • 터미널에서 바로 입력 가능
  • 생성된 변수를 사용할 때는 항상 $를 앞에 붙인다.
    ~$ valName=Hello
    ~$ echo $valName
    ~$ valName="Yes Sir"        # 공백이 있으면 큰따옴표로 묶어줘야함
    ~$ echo $valName
  • 변수의 입력과 출력 : $ 문자가 들어간 글자를 출력하려면 ' ' 또는 " "로 내용물을 묶어서 대입하거나 앞에 역슬래쉬(\)를 붙인다.

    ex) var1.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    myvar="Hi Woo"
    echo $myvar
    echo "\$myvar"         # 출력내용은 $myvar 이다.
    echo '\$myvar'
    echo \$myvar
    echo "값 입력: "
    read myvar        # 터미널에서 입력한 내용을 변수에 저장
    echo \$myvar = $myvar         # 문자열과 변수의 내용을 합한 것.
    exit 0
    --------------------------------------------------------------------------
    ~$ sh var1.sh

  • 변수에 들어 있는 값을 숫자로 해서 사칙 연산등을 하려면 expr 을 사용
  • 수식에 괄호 또는 곱하기(*)는 그 앞에 반드시 역슬래쉬(\)를 붙여야 한다.

    ex) var2.sh
    -------------------------------------------------------------------------
    #! /bin/sh
    num1=100
    num2=$num1+200
    echo $num2         # 문자열("100+200")로 출력된다.
    num3='expr $num1 + 200'
    echo $num3
    num4='expr \($num1 + 200 \)/10 \* 2'
    echo $num4
    exit 0
    -------------------------------------------------------------------------
    ~$ sh var2.sh

  • 파라미터 변수는 $0, $1, $2 ... 의 형태를 가진다.
    • 전체 파라미터는 $*로 표현
    • yum  -y  install  gftp
        $0   $1     $2     $3

      ex) paravar.sh
      -------------------------------------------------------------------------
      #! /bin/sh
      echo "실행파일 이름은 <$0>이다."
      echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>다."
      echo "전체 파라미터는 <$*>다."
      exit 0
      -------------------------------------------------------------------------
      ~$ sh paravar.sh  값1  값2  값3
                       $0        $1   $2    $3

 

4. 쉘 스크립트 - 조건문

  • 기본 if문
      if [ 조건 ]
      then
        참일 경우 실행
      fi

    ex) if1.sh
    -------------------------------------------------------------------------
    #! /bin/sh
    if [ "woo" = "woo" ]
    then
      echo "참입니다."
    fi

    if [ "woo" != "woo" ]
    then
      echo "참입니다."
    else
      echo "거짓입니다."
    fi
    exit 0
    -------------------------------------------------------------------------
    ~$ sh if1.sh

  • 조건문에 들어가는 비교 연산자
    • -n "문자열" : 문자열이 NULL이 아니면 참
    • -z "문자열" : 문자열이 NULL이면 참
    • 수식1 -eq 수식2 : 두 수식이 같으면 참
    • 수식1 -ne 수식2 : 두 수식이 같지 않으면 참
    • 수식1 -gt 수식2 : 수식1이 더 크다면 참
    • 수식1 -ge 수식2 : 수식1이 크거나 같으면 참
    • 수식1 -lt 수식2 : 수식1이 작으면 참
    • 수식1 -le 수식2 : 수식1이 작거나 같으면 참
    • !수식 : 수식이 거짓이면 참
  • 파일과 관련된 조건
    • -d 파일이름 : 디렉토리이면 참
    • -e 파일이름 : 파일 존재하면 참
    • -f 파일이름 : 일반파일이면 참
    • -g 파일이름 : 파일에 set-group-id가 설정되면 참
    • -r 파일이름 : 파일이 읽기 가능이면 참
    • -s 파일이름 : 크기가 0이 아니면 참
    • -u 파일이름 : 파일에 set-user-id가 설정되면 참
    • -w 파일이름 : 파일이 쓰기 가능 상태이면 참
    • -x 파일이름 : 파일이 실행 가능 상태이면 참

      ex) if2.sh
      -------------------------------------------------------------------------
      #! /bin/sh
      fname=/lib/systemd/system/httpd.service
      if [ -f $fname ]
      then
        head -5 $fname
      else
        echo "웹 서버가 설치되지 않았습니다."
      fi
      exit 0
      -------------------------------------------------------------------------
      ~$ sh if2.sh
      또는
      ~$ chmod +x if2.sh
      ~$ ./if2.sh
  • case~esac 문 : 여러 가지 경우의 수가 있다면 case문 (다중분기), if문은 2중분기

    ex) case1.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    case "$1" in
      start)
        echo "시작~~";;
      stop)
        echo "중지~~";;
      restart)
        echo "다시 시작~~";;
      *)
        echo "뭔지 모름~~";;
    esac
    exit 0
    --------------------------------------------------------------------------
    ~$ sh case1.sh stop

    ex) case2.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    echo "리눅스가 재미있나요? (yes/no)"
    read answer         # 사용자 입력값 받아오기
    case $answer in
      yes | y | Y | Yes | YES)
        echo "다행입니다."
        echo "더욱 열심히 하세요 ^^";;
      [nN]*)
        echo "안타깝네요. ㅠㅠ";;
      *)
        echo "yes 아니면 no만 입력했어야죠"
        exit 1;;
    esac
    exit 0
    --------------------------------------------------------------------------
    ~$ sh case2.sh

  • 관계 연산자
    • and는 -a 또는 && 를 사용
    • or는 -o 또는 || 를 사용

      ex) and_or.sh
      --------------------------------------------------------------------------
      #! /bin/sh
      echo "보고 싶은 파일명을 입력하세요."
      read fname
      if [ -f $fname ] && [ -s $fname ] ; then
        head -5 $fname
      else
        echo "파일이 없거나 크기가 0입니다."
      fi
      exit 0
      --------------------------------------------------------------------------
      ~$ sh and_or.sh

 

5. 쉘 스크립트 - 반복문

  • for 문
    for 변수 in 값1 값2 값3 ...
    do
      반복할 문장
    done

    ex) for1.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    hap=0
    for i in 1 2 3 4 5 6 7 8 9 10       # 또는 for i in 'seq 1 10'
    do
      hap='exp $hap + $i'
    done
    echo "1부터 10까지의 합: "$hap
    exit 0
    --------------------------------------------------------------------------
    ~$ sh for1.sh

    ex) for2.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    for fname in $(ls *.sh)      # 해당 명령어의 결과로 나온 파일명을 변수에 대입
    do
      echo "--------$fname---------"
      head -3 $fname
    done
    exit 0
    --------------------------------------------------------------------------
    ~$ sh for2.sh
  • while 문
    ex) while1.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    while [ 1 ]      # 또는 while [ : ]
    do
      echo "CentOS 7"
    done
    exit 0
    --------------------------------------------------------------------------

    ex) while2.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    hap=0
    i=1
    while [ $i -le 10 ]         # 또는 until [ $i -gt 10 ]  : 거짓인동안 계속 반복함.
    do
      hap='expr $hap + $i'
      i='expr $i + 1'
    done
    echo "1부터 10까지의 합:"$hap
    exit 0
    --------------------------------------------------------------------------
    ~$ sh while2.sh

    ex) while3.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    echo "비밀번호를 입력하세요."
    read mypass
    while [ $mypass != "1234" ]
    do
      echo "틀렸음. 다시 입력하세요."
      read mypass
    done
    echo "통과~~"
    exit 0
    --------------------------------------------------------------------------
    ~$ sh while3.sh

 

6. 쉘 스크립트 - 종료문

ex) break_continue_exit.sh
--------------------------------------------------------------------------
#! /bin/sh
echo "무한 반복 입력을 시작합니다.(b: break, c: continue, e: exit)"
while [ 1 ]; do
read input
case $input in
  b | B)
break ;;
  c | C)
echo "continue"를 누르면 while의 조건으로 돌아감"
continue ;;
  e | E)
echo "exit를 누르면 프로그램을 완전히 종료함"
exit 1 ;;
esac;
done
echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됨."
exit 0
--------------------------------------------------------------------------
~$ sh break_continue_exit.sh

 

7. 쉘 스크립트 - 사용자 정의 함수

  • 함수 기본구조
    FuncName () {
      # body
    }
    FuncName

    ex) func1.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    myFunction () {
      echo "함수 안으로 들어왔음"
      return         # 함수 내에서만 사용되는 종료문으로 함수가 호출된 시점으로 돌아감
    }
    echo "프로그램을 시작합니다."
    myFunction
    echo "프로그램을 종료합니다."
    exit 0
    --------------------------------------------------------------------------
    ~$ sh func1.sh

  • 함수의 파라미터 사용
    FuncName () {
      # $1, $2, ... 등을 사용
    }
    FuncName $param1 $param2

    ex) func2.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    hap () {
      echo 'expr $1 + $2'
    }
    echo "10 더하기 20을 실행합니다."
    hap 10 20
    exit 0
    --------------------------------------------------------------------------
    ~$ sh func2.sh

 

8. 쉘 스크립트 - 내장 함수

  • eval : 문자열 자체를 명령문으로 인식하고 실행하기

    ex) eval.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    str="ls -l anaconda-ks.cfg"
    echo $str
    eval $str
    exit 0
    --------------------------------------------------------------------------
    ~$ sh eval.sh

  • export : 외부 변수로 선언해 준다. 즉, 선언한 변수를 다른 프로그램에서도 사용할 수 있도록
    해준다.

    ex) exp1.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    echo $var1
    echo $var2
    exit 0
    --------------------------------------------------------------------------

    ex) exp2.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    var1="지역 변수"
    export var2="외부 변수"
    sh exp1.sh        # exp1.sh 를 실행하는데 외부변수로 var2를 exp1.sh 에서 인식
    exit 0
    --------------------------------------------------------------------------
    ~$ sh exp2.sh

  • printf : 형식을 지정해서 출력

    ex) printf.sh
    --------------------------------------------------------------------------
    #! /bin/sh
    var1=100.5
    var2="재미있는 리눅스~~"
    printf "%5.2f \n\n \t %s \n" $var1 "$var2"
    exit
    --------------------------------------------------------------------------
    ~$ sh printf.sh

  • set $(명령어)
    • 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용
    • 결과를 파라미터로 사용하고자 할 때는 set과 함께 사용

      ex) set.sh
      --------------------------------------------------------------------------
      #! /bin/sh
      echo "오늘 날짜는 $(date) 입니다."        # date 명령어 실행
      set $(date)
      echo "오늘은 $4 요일 입니다."        # 결과를 파라미터로 받음
      exit 0
      --------------------------------------------------------------------------
      ~$ sh set.sh
  • shift
    • 파라미터 변수를 왼쪽으로 한 단계씩 아래로 쉬프트 시킴
    • 10개가 넘는 파라미터 변수에 접근할 때 사용한다
    • 단, $0 파라미터 변수는 변경되지 않음
    • $10 은 $1뒤에 0이붙은 결과를 내보냄

      ex) shift1.sh
      --------------------------------------------------------------------------
      #! /bin/sh
      myfunc() {
        str=""
        while [ "$1" != "" ]; do
      str="$str $1"         # 이전의 파라미터들 값과 바뀌는 $1값이 합쳐짐.
      shift                      # $1이 계속해서 $2가 되고, $3이 되고, ... $10이 된다.
        done
        echo $str
      }
      myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
      exit 0
      --------------------------------------------------------------------------

 

 



비동기(Asynchronous)는 동시에 발생하지 않는다는 뜻으로 컴퓨터에서는

요청과 동시에 결과가 일어나지 않는다는 의미이다. 즉, 요청한 후에 결과가 즉시 나오는 것이

아니라 나중에 결과가 나오는 것이다. 따라서 나중에 결과를 받을 것을 약속했기 때문에

요청한 프로그램은 결과를 받기 전까지 다른 작업을 할 수 있다. 주로 복잡한 요청을

처리할 때 사용하는 방식이다. 동기방식보다 효율적으로 자원을 활용할 수 있다.


동기(Synchronous)는 동시에 발생한다는 뜻으로 컴퓨터에서는 요청과 결과가

동시에 일어난다는 의미이다. 즉, 걸리는 시간에 관계없이 결과를 처리하게 되므로 

요청한 프로그램은 다른 일을 할 수 없게된다. 주로 간단한 요청을 처리 할 때 

사용하는 방식이다.



블로킹(Blocking)은 작업이 중단된다는 뜻이다. 블로킹 방식은  일반적으로 통신에서 요청을 

처리할 때 결과를 받기까지 모든 일을 중단하고 대시상태로 만든다.


논블로킹(Non-blocking)은 블로킹과는 반대로 작업을 중단하지 않고 계속하는 것을 의미한다.

대게 네트워크 통신에서 요청한 작업 외에 다른 작업을 할 수 있기때문에 복잡한 설계에도 

효율이나 반응속도가 블로킹방식보다 뛰어나다.




정리하자면,


동기방식은 간단한 요청을 할 때 사용되며, 다른 작업이 블로킹처리되는 방식이다.

비동기방식은 복잡한 요청을 할 때 사용되며, 작업 처리가 논블로킹이므로 효율적으로 자원을

관리하고, 작업 처리의 반응속도가 빠르다.

'Programming Language > etc' 카테고리의 다른 글

쉘 스크립트 (Shell Script)  (0) 2019.06.26
Double Buffering - 더블 버퍼링 기법  (0) 2017.03.22


더블 버퍼링(Double Buffering)은 이중 버퍼링이라 불리기도 하며, 그래픽 객체에 이미지를 그릴 때 사용되는 기법이다.



Q) 왜 사용하는가 ? 


A) API를 시작하다보면 비트맵 이미지를 사용하게 된다. 그 때 이미지들이 전환되면서 영상처럼 부드럽게 움직일 거라 생각하지만 실제로 이미지들이 움직일 때마다 화면이 깜빡이는 현상이 눈에 들어온다. 쉽게 말하자면 아래와 같은 상황인 것이다.


▶ 게임 캐릭터이미지를 구현할 때 이미지를 움직이게 하고 싶다.

그러나 캐릭터가 띄엄띄엄 움직임과 동시에 깜빡거리는 화면

때문에 게임할 맛이 안난다.



그 이유는 컴퓨터가 이미지를 지웠다가 새 이미지를 다시 그리고 하는 방식을 반복하기 때문이다.


즉, 이미지를 그리는 데 시간이 소요되므로 이미지의 출력이 잦을수록 깜빡거리는 현상이 심해진다.


이에 대한 해결방안으로 버퍼 역할을 해줄 메모리 장치 컨텍스트(보이지 않는 화면)를 하나 더 사용하여 그곳에 이미지를 그리고, 기존화면을 유지하다가 이미지가 완성되면 실제 화면 장치 컨텍스트로 한꺼번에 베껴 그리는 것이다. 


아래는 이를 그림으로 표현한 것이다.






Q) 어떻게 사용하는가 ?


A) 자바를 예로 들자면,


//FIELDS

Image buffImage;

Graphics buffg;


//CONSTRUCTOR

(클래스명) {

repaint(); // 호출 시 repaint() -> update(g) -> paint(g) 순서로 메소드가 호출된다.

}


//METHODS

public void paint(Graphics g) {

if(buffg == null) {

buffImage = createImage(이미지 넓이, 이미지 높이); //버퍼링용 이미지 생성


if(buffImage == null) System.out.println("더블 버퍼링용 오프 스크린 생성 실패");

else buffg = buffImage.getGraphics(); 

//이미지를 생성해도 그래픽 객체를 얻어야 이미지 위에 그리고자하는 것을 그릴 수 있다.

}

update(g); // 이렇게 하면 반복적인 메소드 실행이 가능하다.

}


public void update(Graphics g) {


buffg.drawImage(그릴 이미지, 0, 0, this);


g.drawImage(buffImage, 0, 0, this); //실제 화면(g)으로 오프스크(buffg)에 그려진 이미지(buffImage)를 옮김.

}

+ Recent posts