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
      --------------------------------------------------------------------------

 

 

 

** x64 환경에서는 지원되지 않음

POPAD

  • 스택에 존재하는 값을 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순서로 레지스터에 저장

  • PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용

PUSHAD

  • EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장
  • 레지스터들의 값을 보관해야 할 때 사용

 

pushad 하게 되면

high address ----------------------------------------------> low address

...  |  eax  |  ecx  |  edx  |  ebx  | esp|  ebp  |  esi  |  edi  | ...

순서로 저장된다.

popad 할 때 위치도 저 위치이니 기억해야함

 

 

플래그

ZF 제로 플래그(Zero Flag) 연산 결과가 0이면 참(1)
SF 부호 플래그(Sign Flag) 연산 결과가 음수이면 참(1)

점프 명령어

jz <Operand>  제로 플래그가 참이면(연산 결과 = 0) Operand로 점프 합니다.
jnz <Operand>  제로 플래그가 거짓이면(연산 결과 != 0) Operand로 점프 합니다.
js <Operand>  부호 플래그가 참이면(연산 결과 < 0) Operand로 점프합니다.
jns <Operand>  부호 플래그가 거짓이면(연산 결과 >= 0) Operand로 점프합니다.

 

CMP 명령어에 따른 점프 명령어

cmp <Dest operand>, <Src operand > 대상 피연산자가 소스 피연산자를 비교해 조건부 점프 명령어가 사용할 플래그를 설정합니다.
je <Operand> CMP 명령어의 대상 피연산자와 소스 피연산자가 같으면 목적으로 점프 합니다.
jne <Operand> CMP 명령어의 대상 피연산자와 소스 피연산자가 같지 않으면 점프 합니다.
jl <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작으면 점프 합니다.
jle <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작거나 같으면 점프 합니다.
jnl <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작지 않으면 점프 합니다.
jnle <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작거나 같지 않으면 점프 합니다.
jg <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 큰 경우 점프 합니다.
jge <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 크거나 같으면 점프 합니다.
jng <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 크지 않으면 점프 합니다.
jnge <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 크거나 같지 않으면 점프 합니다.

 

 

 

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

Calling Convention  (0) 2019.07.03
문법, 레지스터 정리  (0) 2019.07.03
POPAD / PUSHAD  (0) 2019.06.25

 

[번역글]

https://m.blog.naver.com/passion053/221079317719

 

파이썬 입문자가 알면 좋은 유려한 기능 10선

* 이하의 내용은 10 Neat Python Tricks Beginners Should Know 의 글을 직접 번역한 것입니다. * 예...

blog.naver.com

https://m.blog.naver.com/PostView.nhn?blogId=passion053&logNo=221112010085&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

효율적인 성능, 메모리, 사용성을 위한 파이썬 코드 사례

* 이하의 내용은 Python Practices for Efficient Code: Performance, Memory, and Usability 의 글...

blog.naver.com

https://m.blog.naver.com/passion053/221058266968

 

파이썬의 유용한 기능들

* 이하의 내용은 Advanced Python Features 의 글을 직접 번역한 것입니다. * 제가 번역한 것을 다른곳...

blog.naver.com

 

파이썬 class 기본 메소드

https://corikachu.github.io/articles/python/python-magic-method

 

파이썬 더블 언더스코어: Magic Method | Corikachu

파이썬에서 __를 달고있는 메소드들에 대해서 살펴봅시다.

corikachu.github.io

 

파이썬 메모리 관리

https://b.luavis.kr/python/python-malloc

 

Luavis' Dev Story - Python의 메모리 할당

Python이 메모리를 할당하고 관리하는 방법

b.luavis.kr

https://www.evanjones.ca/memoryallocator/

 

Improving Python's Memory Allocator

Improving Python's Memory Allocator Evan Jones <ejones@uwaterloo.ca> http://evanjones.ca/ [PDF version] Abstract Python automatically manages memory using reference counting. In order to provide good performance for typical programs, Python provides its ow</ejones@uwaterloo.ca>

www.evanjones.ca

 

쓰레드 관련

https://dgkim5360.tistory.com/entry/understanding-the-global-interpreter-lock-of-cpython

 

왜 Python에는 GIL이 있는가

Python 사용자라면 한 번 쯤은 들어봤을 (안 들어봤다 해도 괜찮아요) 악명 높은 GIL (Global Interpreter Lock)에 대해 정리해본다. Global Interpreter Lock 그래서 GIL은 무엇인가? Python Wiki에서는 이렇게..

dgkim5360.tistory.com

 

비동기 프로그래밍

https://mingrammer.com/translation-asynchronous-python/

 

[번역] 비동기 파이썬

Asynchronous Python을 번역한 글입니다. 파이썬에서의 비동기 프로그래밍은 최근 점점 더 많은 인기를 끌고있다. 비동기 프로그래밍을 위한 파이썬 라이브러리는 많다. 그

mingrammer.com

+ Recent posts