참조 - http://blog.blueweb.co.kr/180

1. bash 스크립트

  1) shbang

    #!/bin/bash

    - 기호 #!은 매직 넘버라 불리며, 커널이 실행 프로그램으로 인식해야 하는지 여부를

      알려주기 위해서 사용한다

    - 항상 스크립트의 첫줄에 나와야한다

 

  2) 주석

    - 주석은 파운드기호(#)가 앞서 나오는 줄을 말한다

 

2. 사용자 입력 읽기 (read)

  1) 파일이나 터미널로부터 입력을 읽어 오기 위해서는 내장 명령 read를 사용한다

  2) read명령은 개행문자가 나타날 때까지 줄을 읽어들인다

  3) 입력받은 내용을 저장할 특별한 이름을 지정하지 않으면, read REPLY라는 특수내장 변수에

      값을 저장한다

  4) read 명령과 옵션

      - read answer       : 표준 입력에서 한줄을 읽어서 변수 answer에 저장한다.   

      - read first last   : 표준 입력에서 한줄을 읽어서, 그 중 첫 단어는 

                            변수 first에 저장하고 나머지는 last에 저장한다.           

      - read              : 입력을 REPLY에 저장한다.                              

      - read -a arrayname : 입력받은 단어 목록을 arrayname라는 배열에 저장한다.   

      - read -e           : 입력줄에서 명령줄 편집을 사용할 수 있다.              

      - read -p prompt    : prompt를 출력하고 입력을 기다린다.                    

      - read -r line      : 입력에 역슬래시를 쓸 수 있게 허용한다.               

 

3. 산술 연산

  1) 정수 타입

    - declare -i 명령을 사용하여 정수 타입 변수를 선언할 수 있다.

      만약 정수 타입 변수에 문자열을 지정하려고 시도하면 배시는 0을 지정한다.

 

    - 정수 타입 변수에 부동소수점 수를 지정하려고 하면 배시는 구문 오류를 출력한다.

 

  2) 다른 수 체계의 사용

     - variable=base#number-in-that-base 형식으로 10진수, 8진수, 16진수, 2진수를 표현 

       할 수 있다

    # declare -i x=017

    # echo $x

    15

      -> 정수타입 변수 x 0으로 시작하는 8진수를 입력한다

    # x=2#101

    # echo $x

    5

      -> 2# 2진수를 의미한다

    # x=8#17

    # echo $x

    15

      -> 8# 8진수를 의미한다

    # x=16#b

    # echo $x

    11

      -> 16# 16진수를 의미한다

 

  3) let

    - let 명령은 배시 쉘의 내장 명령으로 정수 연산과 수치 표현식의 테스트를 위해 사용한다.

     # i=5

     # let i=i+1 -> let 명령이 i 변수에 1을 더한다

     # echo $i

     6

 

    # i=5

    # (( i+=1 )) -> let 명령 대신에 (( )) 명령을 대신 사용할 수 있다 (배시 2.x 지원)

    # echo $i

    6

 

4. 위치 매개변수와 명령줄 매개변수

  1) 위치 매개변수

    - 스크립트 이름 다음에 공백 문자로 구분된 각 단어를 매개변수라 부른다.

    - 명령줄 매개변수는 스크립트 내에서 위치 매개변수로 참고할 수 있다.

      $1은 첫번째 매개변수를, $2는 두번째 매개변수를 의미한다.

    - $9 이후의 매개변수들은 중괄호를 이용하여 숫자부분을 ${10}처럼 묶어주어야 한다.

    - 위치 매개 변수의 종류

      -> $0           : 현재 쉘 스크립트의 이름                                

      -> $#           : 위치 매개변수의 총 개수를 평가                         

      -> $*           : 모든 위치 매개변수를 평가                              

      -> $@           : 큰 따옴표를 사용하였을 때를 제외하고는 $*과 동일한 의미

      -> "$*"         : "$1 $2 $3"으로 평가                                    

      -> "$@"         : "$1" "$2" "$3"으로 평가                                

      -> $1 ... ${10} : 사용 가능한 위치 매개변수   

 

    - $* $@의 차이

      #!/bin/bash

      set 'apple pie' pears peaches         #위치 매개 변수를 설정

                       #apple pie, pears, peaches 세개의 매개변수 존재

      for i in $*

      do

         echo $i

      done

      출력결과

      apple

      pie

      pears

      peaches

      -> $*가 확장되면서 apple pie를 감싸고 있는 따옴표가 사라지게 되어, apple pie는 각각 다른 단어로 분리. for문에서는 각 단어들을 변수 i에 차례로 대입한 후 출력

 

      for i in "$*"

      do

        echo $i

      done

      출력결과

      apple pie pears peaches

       $* 가 큰 따옴표 안에 들어있기 때문에 전체 매개변수를 하나의 문자열로 처리. 변수 i에 전체 문자열이 하나의 단어처럼 저장 된다. 이때 반복문은 한번만 수행

 

      for i in $@

      do

        echo $i

      done

     출력결과

      apple

      pie

      pears

      peaches

     -> 인용부호(큰따옴표)가 없기 때문에 $@ $*와 같은 의미로 사용

 

      for i in "$@"

      do

        echo $i

      done

     출력결과

      apple pie

      pears

      peaches

       $@ 가 큰 따옴표 안에 있으므로 각 위치 매개변수를 개개의 문자열로 처리한다

        “apple pie”, “pear”, “peaches”로 구성 된다.

 

  2) set 명령과 위치 매개변수

    - 위치 매개변수를 재설정하면 기존의 값들은 잃어버리게 된다

    - 모든 위치 매개변수의 설정을 해제하려면 set -- 명령을 사용한다.

    - $0은 언제나 스크립트 이름을 가리킨다

      $ cat test

      #!/bin/bash

      echo '$0' $0

      echo '$*' $*

      echo '$1' $1

      echo '$2' $2

      echo '$#' $#

      old=$*

      set aa bb cc

      echo '$0' $0

      echo '$*' $*

      echo '$1' $1

      echo '$2' $2

      echo '$#' $# 

      (출력결과)

      $ ./test a b c d

      $0 ./test

      $* a b c d

      $1 a

      $2 b

      $# 4

      $0 ./test

      $* aa bb cc

      $1 aa

      $2 bb

      $# 3

         $*는 모든 위치매개변수를 의미한다

 

      $ cat test1

      #!/bin/bash

      name=${1:?"requires an argument"}

      echo Hello $name

 

       $ ./test1

      ./test1: line 2: 1: requires an argument

 

       $ ./test1 aa

       Hello aa

 

        → 특수변수 변경자인 :? $1이 값을 가지고 있는지 검사한다.

            지정한 값이 없으면 스크립트를 종료하고 메시지를 출력한다.

 

 

Posted by linuxism

댓글을 달아 주세요