RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'Shell Programming'에 해당되는 글 1

출처 : 대전국제IT교육센터 정성재 강사

 

1. Shell 프로그래밍의 개요
(1) 개요
   1) 사용자가 임의로 Shell파일을 만들어 필요시 마다 그 파일을 호출하여 실행한다.
   2) Shell은 보통언어가 가지고 있는 기본적인 특성을 가지므로 Shell을 이용하여 사용자 환경에
     맞도록 프로그래밍을 할 수 있다.
   3) Shell파일을 이용한 프로그램을 Shell프로그램 또는 Shell스크립트라고 한다.
   4) Shell프로그램의 수행방법
     ㄱ. chmod를 이용하여 수행하고자 하는 Shell파일에 실행권한을 부여한다.
     ㄴ. Shell파일에 인수를 주어 sh명령을 준다.
(2) 쉘스크립트 생성하는 법
   1) 첫라인에 사용할 쉘을 명시한다. bash쉘을 사용할 경우 보통 첫줄에 다음과 같이 표기한다.
     #!/bin/bash
   2) 스크립트를 실행 가능한 파일로 만든다.
(3) 실행예
   1) 예1
     ㄱ. [posein@www posein]$ cat sample1
         echo "sample1"
           => vi 편집기를 이용하여 입력한다.
         [posein@www posein]$ ls -l sample1
         -rw-rw-r--    1 posein   posein         15 Jun 25 02:49 sample1
           => 현재 실행권한이 없으므로 실행시킬 수가 없다.
         [posein@www posein]$ chmod 755 sample1
           => 실행권한을 부여하였다.
         [posein@www posein]$ ./sample1
         sample1
           => 현재디렉토리에 경로로 설정이 안되어 있으므로 './'를 붙여서 실행시켜야 한다.
     ㄴ. [posein@www posein]$ sh sample1
         sample1
          => 실행권한이 없더라도 앞에 'sh'를 붙여서 실행시킬 수 있다.
   2) 예2 : #!/bin/bash를 명기


2. Shell 프로그래밍 기초
(1) 리다이렉션과 파이프
   1) 다중명령어 사용
    ㄱ. 한 라인에 여러 개의 명령을 입력하면 여러 명령을 수행한다.
    ㄴ. 순차적으로 명령들을 수행할 때 명령들의 구분자는 ';'이다.
    ㄷ. 동시에 명령들을 수행할 때 명령들의 구분자는 '&'이다.
    ㄹ. 사용예
      a. [posein@www posein]$ date; ls -l; whoami
           => 순서대로 실행된다.
      b. [posein@www posein]$ date& ls -l& whoami
           => 동시에 실행된다.
   2) 입출력방향의 재지정
    ㄱ. 표준입출력
       -표준입력(stdin) : 내용입력, 0으로 표기
       -표준출력(stdout) : 내용출력, 1으로 표기
       -표준에러(stderr) : 에러메시지, 2로 표기
    ㄴ. 리다이렉션심볼
       < : 존재하는 파일로 부터 표준입력으로 읽음 (program < input)
       > : 표준 출력으로 파일에 씀 (program > output)
       >> : 존재하는 파일에 표준출력으로 추가함 ( program >> output)
    ㄷ. 입력재지정
      a. 설명: 키보드로부터 명령을 읽는 대신 파일에서 명령을 읽을 때 사용한다.
      b. 입력재지정 기호 : "<"
      c. 사용법
        command < file
      d. 사용예
        [posein@www posein]$ cat red
        ps
        ls
        [posein@www posein]$ sh < red
          PID TTY          TIME CMD
        25289 pts/1    00:00:00 bash
        25581 pts/1    00:00:00 sh
        25582 pts/1    00:00:00 ps
        Desktop  bbb
    ㄹ. 출력재지정
     a. 설명: 명령의 출력을 터미널에 연결하는 대신 파일로 저장할 때 사용한다.
     b. 출력재지정기호 : ">"
     c. 사용법
       command > file
     d. 사용예
       [posein@www posein]$ ls > red2
       [posein@www posein]$ cat red2
       Desktop/
       aaa*
       aaa.sh*
    ㅁ. 출력재지정 추가
     a. 설명: 출력을 파일의 끝에 추가하고자 할 때 사용한다.
     b. 출력재지정기호 : ">>"
     c. 사용법
       command >> file
     d. 사용예
       [posein@www posein]$ ls -l >> red2
    ㅁ. 표준에러 재지정
     a. 설명: 에러메시지를 터미널에 출력하지 않고 파일로 저장할 때 사용한다.
     b. bashd인 경우
       command 2 > errfile
        => 표준에러를 errfile에 저장한다.
       (command > file) 2 > errfile
        => 표준출력은 file에, 에러는 errfile에 저장한다.
     c. C shell인 경우
       command >& errfile
        => 표준에러를 errfile에 저장한다.
       (command > file) >& errfile
        => 표준출력은 file에, 에러는 errfile에 저장한다.
     d. 사용예
       1. [posein@www posein]$ ls -z
          ls: invalid option -- z
          Try `ls --help' for more information.
          [posein@www posein]$ ls -z 2>errfile
          [posein@www posein]$ cat errfile
          ls: invalid option -- z
          Try `ls --help' for more information.
       2. [posein@www posein]$ (ls -z > file) 2>errfile2
          [posein@www posein]$ cat file
          [posein@www posein]$ cat errfile2
          ls: invalid option -- z
          Try `ls --help' for more information.
       3. C Shell에서의 표준에러지정
          [posein@www ~]$ ls -z >& errfile
          [posein@www ~]$ cat errfile
          ls: 부적절한 옵션 -- z
          더 많은 정보를 얻으러면 `ls --help'명령을 하십시오.
       4. C Shell에서 표준출력과 표준에러지정
          [posein@www ~]$ ( ls -z > file2) > & errfile3
   3) 파이프
    ㄱ. 파이프를 사용하면 여러 프로세스를 함께 사용할 수 있다.
    ㄴ. 파이프로 연결된 프로세스는 동시에 수행될 수 있으며, 이 프로세스들 사이의 데이터 흐름은
       자동적으로 다시 계획된다.
    ㄷ. 사용법
       program1 | program2 | .....
    ㄹ. 사용예
       1. [posein@www posein]$ ps | sort | more
            PID TTY          TIME CMD
          25289 pts/1    00:00:00 bash
          25649 pts/1    00:00:00 ps
          25650 pts/1    00:00:00 bash
          25651 pts/1    00:00:00 bash
       2. [posein@www posein]$ ps | sort | more > ps.txt
            => 리다이렉션과 함께 사용하여 파일로 저장할 수도 있다.

3. Shell 프로그래밍 문법

(1) 주석
   1) 설명: 주석은 '#'을 이용하며 해당라인 끝까지 처리된다. 이 부분은 쉘실행시 무시되며, 보통
           프로그램에 대한 이해를 돕기위해 사용된다.
   2) 사용예
     #!/bin/sh
     # Auth: posein
     # Work : hello world 를 출력한다.

     echo "hello world"   # 문자열을 출력한다
(2) 변수
   1) 설명: 변수는 모든 프로그래밍언어의 가장 기본이 되는 요소로 어떠한 데이터를 저장하는 공간
           이다. 쉘에서 변수의 타입은 문자열(string)만을 가지면 C언어처럼 변수타입선언이 필요
           없다. 참고로 perl, python, php등도 변수타입선언이 불필요하다.
   2) 사용법
     var=value
      => 변수를 사용할 때는 변수명앞에 $을 붙인다. 또한 변수에 데이터를 저장할 때는 대입연산자인
        '='를 사용하며 대입연산자, 연산자/피연산자 사이에는 공백이 존재해서는 안된다. 또한 변수
        명은 -를 제외한 특수문자와 숫자로 시작해서는 안된다.
   3) 기타변수 대응법
     ㄱ. ${name} : name이라는 변수에 들어있는 값으로 치환한다.(변수명 다음에 다른 문자가 연이
                  어 나올때 유용)
     ㄴ. ${name:=value} : name이 null이면 value로 할당하여 저장하고, 아니면 그냥 기존의 값으로
                         치환한다.(기본값을 지정할 때 유용)
     ㄷ. ${name:+value} : 기존의 name이 null이 아니라면 value를 사용하지만 name에 저장하지는
                         않는다.
     ㄹ. ${name:-value} : 기존에 name값이 있다면 value를 기본값으로 하고  없다면 value반환.
                         name에 value값을 저장하지는 않는다.
     ㅁ. ${name:?value} : 기존에 name값이 있다면 기본값으로 하고 없으면 error를 내면서 value
                         값을 보여준다.
     ㅂ. ${#name} : name의 문자열 길이를 반환
     ㅅ. ${name:offset} : name값에서 offset만큼 삭제한 후에 값을 돌려준다.
     ㅇ. ${name:offset:length} : name값에서 offset만큼 삭제한 후에 length만큼 센 뒤 돌려준다.
   4) 환경변수
    ㄱ. $HOME: 사용자의 홈디렉토리
    ㄴ. $PATH: 명령어 찾기에 사용되는 콜론(:)으로 구분되는 디렉토리 목록
    ㄷ. $LOGNAME: 사용자의 로그인명($USER)
    ㄹ. $MAIL or $MAILPATH: 메일도착을 알고자 할때 사용되는데 둘 중 하나만 지정, $MAIL이 지정
                           되면 메일이 도착할 파일명이 지정되어야 하고 $MAILPATH가 지정되면
                           콜론(:)으로 분리된 메일 파일의 리스트이여야 한다. 메일프로그램이
                           메일을 어디에 놓아야 하는지를 지정하지는 않지만 새로운 메일이 도착
                           하면 Shell이 어디를 찾아야 하는지를 지정한다.
    ㅁ. $MAILCHECK: 메일 파일을 검사하는 초단위 설정
    ㅂ. $SHELL: 로그인 Shell명
    ㅅ. $PS1: Shell이 사용할 첫번째 프롬프트 스트링, 보통은 $
    ㅇ. $PS2: 두번째 프롬프트 스트링, 명령이 완전히 끝나지 않고 Shell이 또 다른 입력행을 요구
             할 경우 사용, 보통 >
    ㅈ. $TERM: 사용자의 터미널형을 포함, vi같은 어떤 명령은 정확한 결과를 나타내기 위해 사용
              중인 터미널의 종류를 나타냄.
    ㅊ. $IFS: 입력필드 구분자, Shell상에서 입력을 읽어들일 때 글자를 구분하기 위한 목적으로
             사용되는 문자 목록, 보통은 스페이스, 탭, 개행문자임.
   5) 아규먼트 변수: 특별한 내장변수로 '위치 매개변수(positional parameter)'라고도 한다. 이
                    변수는 매개변수를 불러올 때 스크립트의 명령행 인자를 담당한다. 위치 매개
                    변수는 그 이름이 1, 2, 3등으로 되어 있고 그 값을 각각 $1, $2, $3등으로
                    표시하고 0은 스크립트 파일명을 뜻한다.
    ㄱ. $0 : 실행된 쉘 스크립트이름
    ㄴ. $1 : 스크립트에 넘겨진 첫번째 아규먼트
    ㄷ. $2 : 스크립트에 넘겨진 두번째 아규먼트
    ㄹ. $# : 스크립트에 넘겨진 아규먼트의 개수
    ㅁ. $$ : 쉘스크립트의 프로세스ID
    ㅂ. $* : 스크립트에 전달된 인자 전체를 하나의 변수에 저장하며 IFS환경변수의 첫번째 문자로
            구분
    ㅅ. $@ : $*와 동일(다른점은 IFS환경변수를 사용하지 않음)
    ㅇ. $? : 실행한 뒤의 반환(return)값, 즉 참이면 0, 거짓이면 1이 반환됨
    ㅈ. $- : 현재 Shell이 호출될 때 사용한 옵션들
   6) 사용예
    ㄱ. test.sh
       #!/bin/sh
       # 변수에 값을 할당한다.
       a="hello world"
       # 이제 a라는 변수에 등록된 값을 화면에 출력한다.
       echo "a is : $a"
        => 실행파일로 만들어서 실행시키면 'a is : hello world'가 출력된다.
    ㄴ. test2.sh
       num=2
       echo "this is the $numnd"
         => 원하는 값이 "this is the 2nd" 이다. 그러나 위의 예제를 실행시키면 "this is the "
           라는 문자열이 출력된다. 왜냐면 쉘은 "numnd"를 하나의 변수명으로 생각하기 때문이다
           만약 원하는 값을 출력하려면 아래와 같이 바꿔야 한다.
    ㄷ. test3.sh
       num=2
       echo "this is the ${num}nd"
        => 'this is the 2nd' 라고 출력된다.
    ㄹ. [posein@www posein]$ cat var
        var=
        ${var:=ls}
        echo $var
         => var가 null이므로 값에 ls가 들어가면서 해당 명령이 실행된다.
    ㅁ. [posein@www posein]$ echo $DIR

        [posein@www posein]$ echo ${DIR:-temp}
        temp
        [posein@www posein]$ echo $DIR

    ㅂ. [posein@www posein]$ DIR=tmp
        [posein@www posein]$ echo ${DIR:+temp}
        temp
        [posein@www posein]$ echo $DIR
        tmp
    ㅅ. [posein@linux67 posein]$ string1=linux
        [posein@linux67 posein]$ string2=window
        [posein@linux67 posein]$ test $string1 = $string2
        [posein@linux67 posein]$ echo $?
        1
         => $?은 값이 참이면 0, 거짓이면 1을 출력한다.
    ㅇ. [posein@www posein]$ cat test4.sh
         #!/bin/bash
         echo "This script file $0"
         echo "Argument Count is $#"
         echo "Process ID is $$"
         echo "Argument List \$* : $*"
         echo "Argument List \$@ : $@"
         echo "Argument 1: $1"
         echo "Argument 2: $2"
         echo "Argument 3: $3"
         [posein@www posein]$ ./test4.sh a b c
         This script file ./test4.sh
         Argument Count is 3
         Process ID is 31779
         Argument List $* : a b c
         Argument List $@ : a b c
         Argument 1: a
         Argument 2: b
         Argument 3: c
    ㅈ. $@와 $*의 차이점
       [posein@www posein]$ cat ii1
       #!/bin/bash
       IFS=,
       echo "$@"
       [posein@www posein]$ cat ii2
       #!/bin/bash
       IFS=,
       echo "$*"
       [posein@www posein]$ ./ii1 a b c
       a b c
       [posein@www posein]$ ./ii2 a b c
       a,b,c
        => $*는 IFS를 사용하고 $@는 IFS를 사용하지 않는다.
    ㅊ. [posein@www posein]$ count=Ilovebash
        [posein@www posein]$ echo ${count:5}
        bash
        [posein@www posein]$ echo ${count:5:2}
        ba
   7) Shell변수의 출력
    ㄱ. set: 현재 정의되어 있는 모든 변수와 그 값을 출력
    ㄴ. env: export된 변수의 값만 출력
    ㄷ. exoprt:
      a. 설명: 특정변수의 범위를 환경 데이터 공간으로 전송하여 자식프로세스에서도 그 특정변수
              를 사용 가능하게 함.
      b. 특징
        - Shell프로그램이 호출될 때 export를 사용한 모든 변수에 대한 복사가 만들어져 호출된
          프로그램으로 전달되게 하여 변수의 범위를 확대시킨다.
        - 인자가 없는 export명령은 export된 변수의 리스트를 얻을 수 있다.
        - 서브 Shell에서 수정된 환경변수값은 부모 Shell에 영향을 주지 못한다.
        - 서브 Shell에서 변수를 export하면 export된 변수는 그 다음 서브 Shell에 영향을 준다.
    ㄹ. 예제
          [posein@www posein]$ cat main
          echo shell programming
          name=test
          city=seoul
          echo name is $name
          echo city is $city
          export name
          ./sub
          echo stop main
          [posein@www posein]$ cat sub
          echo start sub
          echo name is $name
          echo city is $city
          echo stop sub
          [posein@www posein]$ ./main
          shell programming
          name is test
          city is seoul
          start sub
          name is test
          city is
          stop sub
          stop main
   8) 정의된 변수의 제거
    ㄱ. unset 변수명
       => 변수의 값을 널(Null)로 만드는 것이 아니라, 존재하지 않게 한다.
    ㄴ. readonly 변수명
       => 읽기전용 변수로 되어 삭제할 수가 없다.(로그아웃할 때까지 적용된다.)
    ㄷ. 예
       1. [posein@www posein]$ str1=test1
          [posein@www posein]$ echo $str1
          test1
          [posein@www posein]$ unset str1
          [posein@www posein]$ echo $str1
       2. [posein@www posein]$ str2=test2
          [posein@www posein]$ readonly str2
          [posein@www posein]$ echo $str2
          test2
          [posein@www posein]$ str2=test3
          bash: str2: readonly variable
          [posein@www posein]$ echo $str2
          test2
   9) echo문과 escape문자
    ㄱ. 설명: echo문은 라인을 제어하는 명령해석기이며 -e옵션과 같이 \으로 시작하는 escape
             특수문자를 사용할 수 있다.
    ㄴ. 종류
       \b : Backspace
       \c : 새로운 라인의 생성을 억제(bash에서는 안됨)
       \f : Formfeed
       \n : 새로운 라인을 생성
       \r : Carrage Return
       \t : Tab문자
       \\ : Backslash
    ㄷ. 사용예
       [posein@www posein]$ echo "Hi\nHello"
       Hi\nHello
       [posein@www posein]$ echo -e "Hi\nHello"
       Hi
       Hello
   10) 특별구문: expr
    ㄱ. expr은 명령라인에 있는 표현식을 평가한다.
    ㄴ. 수학적인 표현식(+, -, *, /)을 계산하고 표준출력에 결과값을 출력한다.
    ㄷ. 결과값은 역인용부호(`)에 의해 다른 변수에 저장가능하다.
    ㄹ. expr명령은 수식의 연산자 앞 뒤에 반드시 공백이 필요하다.
    ㅁ. 정확한 정수 연산시 사용되고 소수점 계산은 불가능
    ㅂ. 예제
      a. [posein@www posein]$ expr 1 + 2
         3
      b. [posein@www posein]$ int=100
         [posein@www posein]$ expr 100 + $int + 10
         210
      c. [posein@www posein]$ int=0
         [posein@www posein]$ result='expr $int + 5'
         [posein@www posein]$ echo $result
         expr $int + 5
         [posein@www posein]$ result=`expr $int + 5`
         [posein@www posein]$ echo $result
         5
          => 단일 인용부호(' ')를 사용하면 둘러싸인 전체가 변수에 저장되며 역인용부호(` `)를
            사용하면 연산결과가 변수에 저장된다.
      d. [posein@www posein]$ expr 3 * 5
         expr: syntax error
         [posein@www posein]$ expr 3 \* 5
         15
           => *만 사용하면 특수문자로 인식하여 에러가 발생한다. 따라서 *앞에 \를 사용하여 특수
             문자의 의미를 제거하거나 인용부호인 " "나 ' '를 사용해야 한다.
      e. [posein@www posein]$ expr 10 / 3
         3
          => /는 나누어서 몫을 구한다.
      f. [posein@www posein]$ expr 10 % 3
         1
          => %는 나누어서 나머지를 구한다.
   11) 변수타입지정: decalre 와 typeset
    ㄱ. 설명: 이 두 명령은 내장명령으로 동의어이다. 역할은 변수의 특성을 제한한다. declare
             명령어는 bash 버전 2이후부터 가능하고 typeset명령은 ksh스크립트에서도 가능하다.
             declare명령을 아무 옵션없이 실행하면 모든 변수값을 출력한다.
    ㄴ. 사용법
       declare [option] [변수=변수값]
    ㄷ. option
       -r : 읽기전용으로 취급한다. readonly로 선언하는 것과 같다.
       -i : 정수로 취급한다.
       -a : 배열로 취급한다.
       -f : 정의된 함수의 목록을 출력한다.
       -F : 정의된 함수의 이름만을 출력한다.
       -x : export시켜서 외부환경에서도 이 변수를 사용할 수 있게 해준다.
    ㄹ. 사용예
     a. [posein@www posein]$ declare
          => 정의된 변수와 함수 등을 보여준다.
     b. [posein@www posein]$ declare -f
        declare -f popd ()
        {
          DIR_STACK=${DIR_STACK#* };
          cd ${DIR_STACK%% *};
          echo "$PWD"
        }
        declare -f pushd ()
        {
          dirname=$1;
          DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
          cd ${dirname:?"missing directory name."};
          echo "$DIR_STACK"
        }
          => 정의된 함수명과 함수를 출력한다. -f옵션뒤에 함수명을 명기하면 해당 함수에 대한
            정보만을 출력한다.
     c. [posein@www posein]$ declare -F
        declare -f popd
        declare -f pushd
     d. [posein@www posein]$ val1=3 val2=5
        [posein@www posein]$ result1=val1*val2
        [posein@www posein]$ echo $result1
        val1*val2
        [posein@www posein]$ declare -i val3=3 val4=5
        [posein@www posein]$ declare -i result2
        [posein@www posein]$ result2=val3*val4
        [posein@www posein]$ echo $result2
        15
(3) 인용부호
   1) 설명: 쉘에는 특별한 의미를 가지고 있는 특수문자들이 있는데, 이를 메타문자(meta character
           )라고도 한다. 이러한 특수문자를 문자그대로 사용하고자 할 때 즉, 문자나 단어의 특별
           한 의미를 없앨 때 인용부호를 사용할 수 있다.
   2) 종류
     ㄱ. single quotes(' '): 문자열로 표기(변수명 자체를 문자열로 표기)
     ㄴ. double qutoes(" "): 문자열로 표기(변수값을 하나의 인자로 인식, 즉 $, `, \는 문자열에서
                            제외됨)
     ㄷ. backslash(\) : 문자의 특수한 기능을 제거
     ㄹ. back quotes(` `) : 명령어로 인식
   3) 사용예
     ㄱ. [posein@www posein]$ echo 'My Home Directory is $HOME'
         My Home Directory is $HOME
          => $HOME을 그냥 문자열로 취급한다.
     ㄴ. [posein@www posein]$ echo "My Home Directory is $HOME"
         My Home Directory is /home/posein
          => $HOME의 값을 출력한다. (" "는 $, `, \의 특수한 기능을 인정)
     ㄷ. [posein@www posein]$ echo "My Home Directory is \$HOME"
         My Home Directory is $HOME
          => \의 특수한 기능을 제거하여 $를 문자열화 하여 $HOME가 출력된다.
     ㄹ. [posein@www posein]$ echo 'My Home Directory is \$HOME'
         My Home Directory is \$HOME
          => ' '는 모든 특수문자를 무조건 문자열처리하므로 그대로 출력된다.
     ㅁ. [posein@www posein]$ echo "Current Directory is `pwd`"
         Current Directory is /home/posein
          => ` `는 명령어가지고 있는 기능을 인정한다. 역시 " "입장에서 봤을 때 ` `의 특수한
            기능을 인정한다.
     ㅅ. [posein@www posein]$ name=posein
         [posein@www posein]$ echo $name
         posein
          => name의 값인 posein을 출력한다.
         [posein@www posein]$ echo \$name
         $name
          => \는 바로 다음 문자의 특수한 기능을 문자열로 전환시킨다.
         [posein@www posein]$ echo \\$name
         \posein
          => 역시 \는 바로 다음에 나오는 \의 특수한기능을 없앤다.
(4) 간단한 조건문
   1) 설명: test명령을 기본으로 보통 if문과 같이 사용된다. 보통 test라고 입력하지만 보통 쉘
           스크립트상에서는 test라는 명령어를 생략하고 [ ] 로 한다. 이러한 테스트 조건들은
           '['와 ']'사이에 쓰면되고, '['과 ']'사이에는 반드시 공백문자가 들어가야 한다.
   2) 사용법
     test 표현식
     [ 표현식 ]
   3) 표현식
     ㄱ. 문자열비교
        a. [ string ] : string이 빈 문자열이 아니라면 참
        b. [ string1 = string2 ] : 두 문자열이 같다면 참
        c. [ string1 != string2 ] : 두 문자열이 다르면 참
        d. [ -n string ] : 문자열이 null(빈문자열)이 아니라면 참
        e. [ -z string ] : 문자열이 null(빈문자열)이면 참
     ㄴ. 산술비교
        a. [ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참(Equal)
        b. [ expr1 -ne expr2 ] : 두 표현식 값이 같지 않다면 참(Not Equal)
        c. [ expr1 -gt expr2 ] : expr1 > expr2 이면 참(Greater Then)
        d. [ expr1 -ge expr2 ] : expr1 >= expr2 이면 참(Greater Equal)
        e. [ expr1 -lt expr2 ] : expr1 < expr2 이면 참(Less Then)
        f. [ expr1 -le expr2 ] : expr1 <= expr2이면 참(Less Equal)
        h. [ ! expr ] : expr이 참이면 거짓, 거짓이면 참
        i. [ expr1 -a expr2 ] : expr1 AND expr2의 결과, 즉 둘 다 참이면 참
        j. [ expr1 -o expr2 ] : expr1 OR expr2의 결과, 즉 둘 중 하나만 참이면 참
     ㄷ. 파일조건
        a. [ -b FILE ] : FILE이 블럭디바이스이면 참
        b. [ -c FILE ] : FILE이 문자디바이스이면 참
        c. [ -d FILE ] : FILE이 디렉토리이면 참
        d. [ -e FILE ] : FILE이 존재하면 참
        e. [ -f FILE ] : FILE이 존재하고 정규파일이면 참(호환성 문제로 -e보다 -f가 주로 사용)
        f. [ -g FILE ] : FILE에 SGID가 있으며 참
        g. [ -k FILE ] : FILE에 Sticky bit가 있으면 참
        h. [ -L FILE ] : FILE이 심볼릭링크이면 참
        i. [ -p FILE ] : Named pipe이면 참
        j. [ -r FILE ] : 현재 사용자가 읽을 수 있는 파일이면 참
        k. [ -s FILE ] : 파일이 비어있지 않으면 참
        l. [ -S FILE ] : 소켓디바이스이면 참
        m. [ -t FD ] : FD(File Descriptor)가 열려진 터미널이면 참
        n. [ -u FILE ] : FILE에 SUID가 있으면 참
        o. [ -w FILE ] : 현재사용자가 쓸 수 있는 파일(writable file)이면 참
        p. [ -x FILE ] : 현재사용자가 실행할 수 있는 파일(Excute file)이면 참
        q. [ -O FILE ] : FILE의 소유자가 현재 사용자이면 참
        r. [ -G FILE ] : FILE의 그룹이 현재 사용자의 그룹과 같으면 참
        s. [ FILE1 -nt FILE2 ] : FILE1이 FILE2보다 새로운 파일(최근의 파일)이면 참
        t. [ FILE1 -ot FILE2 ] : FILE1이 FILE2보다 오래된 파일이면 참
        u. [ FILE1 -ef FILE2 ] : FILE1이 FILE2의 하드링크, 즉 I-node값이 같으면 참
   4) 사용예
    ㄱ. [posein@www posein]$ cat test5.sh
        if [ -d data ]
        then
        cd data
        echo "data's File List"
        ls
        fi
         => 현재 디렉토리에 data라는 디렉토리가 존재할 경우 data's File LIst라는 문자열과
            함께 파일의 리스트를 보여준다.
    ㄴ. [posein@www posein]$ cat test6.sh
        [ "$LOGNAME" = "root" ]
        echo $?
        [posein@www posein]$ ./test6.sh
        1
         => 로그인한 사용자가 root가 아니므로 반환값이 1, 즉 거짓이다.
    ㄷ. [posein@www posein]$ cat test7.sh
        [ "$LOGNAME" = "posein" ]
        echo $?
        [posein@www posein]$ ./test7.sh
        0
         => 로그인한 사용자와 일치하므로 반환값이 0, 즉 참이다.
    ㄹ. [posein@linux67 posein]$ test 20 -gt 30
        [posein@linux67 posein]$ echo $?
        1
        [posein@linux67 posein]$ test 20 -lt 30
        [posein@linux67 posein]$ echo $?
        0
(5) 목록
   1) 설명: 여러 명령을 실행할 때 앞의 명령의 결과에 의해서 다음행도 결정되어야 할 경우가 있
           다. 이런 경우에 AND나 OR조건을 사용해서 한번에 처리할 수 있다. 이것은 쉘스크립트
           뿐만아니라 명령행에서도 사용가능하다. if문을 사용하는 것보다 간결하다.
   2) 종류
    ㄱ. &&
      a. 설명: AND를 의미한다. &&는 왼쪽 문장이 참이면 오른문장을 실행한다. 수행도중에 결과
              가 거짓이 되면 그 이후의 명령은 수행되지 않는다.
      b. 사용법
        문장1 && 문장2 && 문장3 && .....
      c. 사용예
        [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
          => 왼쪽문장이 참이면 오른쪽 문장을 실행시킨다. 즉 /etc/shadow가 존재하면
            "This computer uses shadow passwords"라는 문자열을 출력한다.
    ㄴ. ||
      a. 설명: OR를 의미한다. 각 문장들이 거짓이 나오는 동안에 계속 실행된다. 즉 참이 나오면
              실행을 멈춘다.
      b. 사용법
        문장1 || 문장2 || 문장3 || ...
      c. 사용예
        [posein@icf04 posein]$ cat mail.sh
        #!/bin/sh
        mailfolder=/var/spool/mail/posein
        [ -r "$mailfolder" ] || { echo "Can not read $mailfolder"; exit 1;}
        echo "$mailfolder has mail from : "
        grep "^From " $mailfolder
         => posein이라는 사용자의 메일파일을 검사하여 파일을 읽을 수 없으면 에러메시지와
           함께 종료하고 그렇지 않으면 grep명령을 이용하여 누구한테 메일이 왔는지를 보여
           주는 스크립트이다.
        [posein@icf04 posein]$ ./mail.sh
        /var/spool/mail/posein has mail from :
        From posein  Wed Jun 26 21:50:15 2002
    ㄷ. &&과 ||의 혼용
      a. 설명: &&와 ||는 혼용이 가능하다.
      b. 사용법
        1. && 문장1 || 문장2
         => 조건이 참이면 문장1을 수행하고 조건이 거짓이면 문장2를 수행한다.
        2. && {
               문장1
               문장2
               문장3
              }
           ||
              {
               문장4
               문장5
               문장6
             }
          => 참이냐 거짓이냐에 따라 여러개의 문장을 수행하고 싶을 때는 { }을 사용한다.
      c. 사용예
       [posein@www posein]$ cat test8.sh
       #!/bin/bash
       [ -f /etc/shadow ] && echo "/etc/shadow is existed" || echo "/etc/shadow is not
        existed"
       [posein@www posein]$ ./test8.sh
       /etc/shadow is existed
        => /etc/shadow파일이 존재하면 "/etc/shadow is existed"라는 문자열이 출력되고 존재
         하지 않으면 "/etc/shadow is not existed"가 출력된다. 참고로 root권한자에서 pwunconv
         명령을 내린뒤에 다시 수행시켜보도록 한다.
(6) 조건문
   1) if
    ㄱ. 설명: 참인지 거짓인지를 판단할 때 사용된다. 참이라면 then부분을 실행하고 그렇지 않으
             면 else부분을 실행한다.
    ㄴ. 사용법
      - 형식1(단일 if문)
       
        if [ 조건 ]
        then
         실행문장
        fi

      - 형식2(if ~ else)

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

      - 형식3(if ~ elif) : elif는 else if의 약자로 이 구문은 여러 개 사용해도 무방하다.

        if [ 조건1 ]
        then
           실행문장1
        elif [ 조건2 ]
           실행문장2
        else
           실행문장3
        fi
    ㄷ. 사용예
      a. [posein@icf04 posein]$ cat test.sh
         #!/bin/sh
         if [ "$SHELL" = "/bin/bash" ]
         then
              echo "your login shell is the bash (bourne again shell)"
         else
              echo "your login shell is not bash but $SHELL"
         fi
         [posein@icf04 posein]$ ./test.sh
         your login shell is the bash (bourne again shell)
      b. [posein@linux67 posein]$ cat tt
         if [ "$1" = "rose" ]
         then
          echo ROSE
         else echo FLOWER
         fi
         [posein@linux67 posein]$ ./tt rose
         ROSE
         [posein@linux67 posein]$ ./tt lily
         FLOWER
          => 첫번째 아규먼트값으로 rose가 오면 ROSE가 출력되고 그 외의 경우에는 FLOWER가
            출력된다.
     c. [posein@linux67 posein]$ cat tt2
        if [ "$1" = "rose" ]
        then
          echo ROSE
        elif [ "$1" = "lily" ]
        then
          echo LILY
        else
          echo FLOWER
        fi
        [posein@linux67 posein]$ ./tt2 rose
        ROSE
        [posein@linux67 posein]$ ./tt2 lily
        LILY
        [posein@linux67 posein]$ ./tt2 tulip
        FLOWER
         => 아규먼트에 rose가 오면 ROSE, lily가 오면 LILY, 그 외의 값이 오면 FLOWER가 출력
           된다.
     d. [posein@linux67 posein]$ cat i1
        #!/bin/bash
        echo "읽어들인 파일의 이름은?";read var
        if [ -f $var ]
         then
          echo file
        else
           if [ -d $var ]
             then
               echo directory
           else
               echo "not found"
           fi
        fi
        [posein@linux67 posein]$ ./i1
        읽어들인 파일의 이름은?
        /etc/shadow
        file
     e. [posein@www posein]$ cat i2
        #!/bin/bash
        if test -z "$1"
        then
            echo usage:i2 filename
            exit 1
        fi
        file_size=`wc -c < $1`
        echo the file size $file_size characters
        if test $file_size -le 5120
        then
            echo the file $1 is a small file
        else
            echo the file $1 is a large file
        fi
        [posein@www posein]$ ./i2 /etc/passwd
        the file size 3875 characters
        the file /etc/passwd is a small file
     f. [posein@www posein]$ cat el1
        #!/bin/bash
        echo "Are you man? (y/n)";read var
        if [ "$var" = "y" ]
        then
            echo "You are man"
        elif [ "$var" = "n" ]
        then
            echo "You are woman"
        else
            echo "enter y or n"
        fi
        [posein@www posein]$ ./el1
        Are you man? (y/n)
        y
        You are man
   2) case문
    ㄱ. 설명: 문자열과 일치하는 정규식부분을 찾아 해당하는 정규식 다음에 있는 명령어를 실행시
             킨다. 아래로 계속 내려가면서 문자열에 해당하는 부분을 찾고 보통 맨 마지막에
             나열한 정규식에 해당하지 않는 모든 경우에 해당하는 부분은 *)로 표기한다.
    ㄴ. 사용법
       case 문자열
       in
         정규식1) 명령어1;;
         정규식2) 명령어2;;
       ...
       esac
        => 오른쪽 괄호와 세미콜론은 반드시 사용해야 한다.
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt3
        case $1
        in
          0) echo zero;;
          1) echo one;;
          2) echo two;;
          3) echo three;;
          *) echo greater than four
        esac
        [posein@linux67 posein]$ ./tt3 2
        two
          => 아규먼트와 동일한 정규식을 찾아 해당 명령어를 수행한다.
     b. [posein@www posein]$ cat ca1
        #!/bin/bash
        echo "*********************************************"
        echo "*              보         기                *"
        echo "*********************************************"
        echo "1. who    2. date    3. pwd    4. ls -l     *"
        echo "*********************************************"
        echo "수행하고자 하는 명령어는?(번호를 입력하시오) "
        read number;
        case $number in
          1) who;;
          2) date;;
          3) pwd;;
          4) ls -l;;
          *) echo "없는 번호입니다."
        esac
        [posein@www posein]$ ./ca1
        *********************************************
        *              보         기                *
        *********************************************
        1. who    2. date    3. pwd    4. ls -l     *
        *********************************************
        수행하고자 하는 명령어는?(번호를 입력하시오)
        3
        /home/posein
     c. [posein@www posein]$ cat ca2
        #!/bin/bash
        echo "is it morning? (yes/no)"
        read ans;
        case "$ans" in
             yes | y | Yes | YES)           echo "good morning";;
             no  | n | No | NO)             echo "good afternoon";;
             *) echo "answer not recognize";;
        esac
        [posein@www posein]$ ./ca2
        is it morning? (yes/no)
        n
        good afternoon
   3) select문
    ㄱ. 설명: 이 구문은 다른 쉘에는 없고 콘쉘과 배시쉘에만 존재하는 구문으로 문법이 간결하다.
             구조는 for문과 유사하다.
    ㄴ. 사용법
       select 변수 in 값1, 값2,...
       do
          실행문장
       done
        => in 다음에 나오는 값들이 항목으로 된 메뉴로 생성된다. 이 값들이 생략되면 기본값은
          "$@"가 된다. 형식은 번호를 선택하게 되어 있으며, 사용자에게 번호를 표시해준다.
          "변수"에 선택된 내용을 저장하고 선택된 번호는 내장변수인 REPLY에 저장하고 "실행문장"
           이 실행된다.
    ㄷ.사용예
       [posein@www posein]$ cat sele1
       #!/bin/bash
       echo "What is your favourite OS ?"
       select var in "Linux" "Free BSD" "Windows" "Solaris" "Other"
          do
                break
          done
       echo "You have selected $var"
       [posein@www posein]$ ./sele1
       What is your favourite OS ?
       1) Linux
       2) Free BSD
       3) Windows
       4) Solaris
       5) Other
       #? 1
       You have selected Linux

(7) 반복문: 루프는 지정된 숫자나 몇가지 조건을 만날 때까지 일련의 명령들을 반복적으로 수행할
            수 있게 한다.
   1) for
    ㄱ. 설명: for문은 지정된 범위 안에서 루프를 수행한다. 범위는 어떤 집합도 가능하다. in뒤의
             값1, 값2, ...가 순서대로 지정된 변수에 배정되면서 do이하의 문장을 수행한다. 즉 매
             루프를 돌 때마다 변수의 값은 in이후의 값으로 대체된다.
    ㄴ. 사용법
      for 변수 in 값1, 값2
      do
         실행문장
      done
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt4
        for flower in Rose Tulip Lily
        do
          echo $flower
        done
        [posein@linux67 posein]$ ./tt4
        Rose
        Tulip
        Lily
         => flower라는 변수에 Rose, Tulip, Lily라는 값이 루프를 돌면서 들어가 출력된다.
     b. [posein@linux67 posein]$ cat tt6
        for file in $(ls chap[345].txt)
        do
          echo "-----$file-----" >> book.txt
        cat $file >>book.txt
        done
        [posein@linux67 posein]$ ./tt6
        [posein@linux67 posein]$ cat book.txt
        -----chap3.txt-----
        chap3 Page
        -----chap4.txt-----
        chap4 Page
        -----chap5.txt-----
        chap5 Page
         => chap3.txt, chap4.txt, chap5.txt파일을 book.txt라는 파일에 붙여넣는다.
     c. [posein@www posein]$ cat for1
        #!/bin/bash
        for var in *
        do
          file_size=`wc -c<$var`
          echo $var contains $file_size characters
          if test $file_size -le 5120
          then
               echo the file $var is a small file
          else
               echo the file $var is a large file
          fi
        done
         => for문에서 *는 현재디렉토리에 있는 모든 파일들을 값으로 받아들여 출력한다.
   2) while
    ㄱ. 설명: while뒤의 조건문 동안 do이하의 문장을 실행한다. for구문과 같이 실행 횟수를 지정
              하지 않아도 된다.
    ㄴ. 사용법
       while 조건문
       do
         실행문장
       done
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt7
        var=1
        while [ "$var" -le 5 ]
        do
           echo $var
           var=`expr $var + 1`
       done
       [posein@linux67 posein]$ ./tt7
       1
       2
       3
       4
       5
         => var이 5보다 작거나 같으면 var에 1씩 더한다. 결과는 1,2,3,4,5가 차례로 출력된다.
           참고로 expr은 연산할 때 사용한다.
     b. [posein@linux67 posein]$ cat tt8
        echo "Enter Password: "
        read password1
        echo "Retype Password: "
        read password2
        while [ "$password1" != "$password2" ]
        do
           echo "Password miss match Try again"
           echo "Retype Password: "
        read password
        done
        echo "OK Password Match complete"
          => 패스워드를 두 번 입력하여 두 값이 일치하지 않을 경우, 다시 입력을 요구한다. (물
            론 패스워드로 입력한 문자는 화면에 그대로 출력된다.)
   3) until
    ㄱ. 설명: until은 while문과 동일한 효과를 내지만 조건이 반대이다. 즉, while문은 조건이 참
             일 동안 루프를 수행하지만, until은 거짓일 동안 루프를 수행한다.
    ㄴ. 사용법
       until 조건문
       do
         실행문장
       done
    ㄷ. 사용예
       [posein@linux67 posein]$ cat tt9
       COUNTER=20
       until [ $COUNTER -lt 10 ]
       do
          echo COUNTER is $COUNTER
          COUNTER=`expr $COUNTER - 1`
       done
       [posein@linux67 posein]$ ./tt9
       COUNTER is 20
       COUNTER is 19
       COUNTER is 18
       COUNTER is 17
       COUNTER is 16
       COUNTER is 15
       COUNTER is 14
       COUNTER is 13
       COUNTER is 12
       COUNTER is 11
       COUNTER is 10
         => 20에서 부터 10까지 차례로 출력된다.
(8) 함수
   1) 설명
    ㄱ. 함수란 일종의 '스크립트안의 스크립트'라고 할 수 있다.
    ㄴ. 명령어 그룹을 메모리내에 정의하여 약어의 기능으로 사용할 수 있다. 메모리에 함수가 존재
       함으로서 수행속도를 향상시킨다.
    ㄷ. Shell 스크립트의 크기를 적절히 조절할 경우에 사용하고 코드를 구조화하는데 유리하다.
   2) 사용법
    ㄱ. 함수이름()
        {
           command
        }
    ㄴ. function 함수이름
        {
           command
        }
   3) 사용예
     [posein@www posein]$ cat fun
     #!/bin/bash
     user_print()
     {
       echo "shell programming"
     }
     echo "start user_print"
     user_print
     echo "end user_print"
     [posein@www posein]$ ./fun
     start user_print
     shell programming
     end user_print
   4) 참고할만 명령어
    ㄱ. type
     a. 설명: 주어진 인자가 쉘 스크립트, 함수, 앨리어스인지를 검사하여 출력한다. 기본적으로
             함수이면 정의된 내용까지 모두 출력한다.
     b. 사용법
       type [option] 인자
     c. option
       -all : 해당 인자이름으로 정의된 모든 사항을 출력한다.
       -path : 실행파일이나 쉘 스크립트에 국한되어 결과를 출력한다.
       -type : 여러결과는 인자이름과 일치하는 키워드 하나만을 출력한다.
     d. 사용예
       1. [posein@www shell]$ type pushd
          pushd is a function
          pushd ()
          {
              dirname=$1;
              DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
              cd ${dirname:?"missing directory name."};
              echo "$DIR_STACK"
          }
       2. [posein@www shell]$ type -all pushd
          pushd is a function
          pushd ()
          {
              dirname=$1;
              DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
              cd ${dirname:?"missing directory name."};
              echo "$DIR_STACK"
          }
          pushd is a shell builtin
       3. [posein@www shell]$ type -type pushd
          function
       4. [posein@www shell]$ type -all -type pushd
          function
          builtin
(9) 명령실행
   1) 산술확장
    ㄱ. 설명: 산술연산을 하는 expr명령은 실행이 매우 느리기 때문에 사용한다.
    ㄴ. 사용법
       $((...))
    ㄷ. 사용예
       [posein@www posein]$ cat ex1
       #!/bin/bash
       var=0
       while [ "$var" -ne 10 ]
       do
           echo $var
           var=$((var+1))
       done
       exit 0
      [posein@www posein]$ ./ex1
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
   2) 패턴과 패턴비교
    ㄱ. 설명: 일종의 문자열을 연산하는 것으로 특정한 패턴(pattern)을 놓고 변수의 문자열 값이
             일부분이라도 이 패턴과 일치하는지 검사할 때 쓰인다. 이 패턴에는 와일드카드문자
             (*, ?, [ ]를 포함한 문자세트)를 포함해도 된다.
    ㄴ. 종류
       ${variable#pattern} : 처음부터 pattern과 맞는 variable의 부분을 찾아 이 중 가장 작은
                            부분을 제거하고 나머지를 반환
       ${variable##wpattern} : 처음부터 pattern과 맞는 variable의 부분을 찾아 가장 큰 부분을
                              제거하고 나머지 부분을 반환
       ${variable%pattern} : 끝에서부터 pattern과 일치하는 variable의 최소부분을 제거하고
                            나머지를 반환
       ${variable%%pattern} : 끝에서부터 pattern과 일치하는 variable의 최대부분을 제거하고
                             나머지를 반환
    ㄷ. 사용예
      [posein@www posein]$ cat ex3
      #!/bin/bash
      unset var1
      echo ${var1:-string2}
      var1=string1
      echo ${var1:-string2}
      var1=/etc/sysconfig/network
      echo ${var1#*/}
      echo ${var1##*/}
      var2=/etc/sysconfig/network-script/ifcfg-lo
      echo ${var2%sysconfig*}
      echo ${var2%%sysconfig*}
      exit 0
      [posein@www posein]$ ./ex3
      string2
      string1
      etc/sysconfig/network
      network
      /etc/
      /etc/
(10) 기타관련명령어
   1) read
    ㄱ. 설명: 임의의 자료를 키보드로부터 입력받는 명령어로 read를 사용하며, 연속으로 여러 자료
             를 받을 수도 있다. 아규먼트는 차례대로 1,2,3,...순으로 매겨지고, 실행시킨 스크립
             트 파일 이름의 자체 아규먼트는 0이다.
    ㄴ. 사용법
       read 변수1 [변수2, ....]
    ㄷ. 사용예
       a. [posein@linux67 posein]$ read flower
          rose
           => read flower라고 입력하면 입력받을 수 있는 대기상태가 된다. 그 상태에서 값을 입력
             한다.
          [posein@linux67 posein]$ echo $flower
          rose
           => echo문으로 값을 확인한다.
       b. [posein@linux67 posein]$ read var1 var2
          aaa bbb
          [posein@linux67 posein]$ echo $var2 $var1
          bbb aaa
           => read문을 이용하여 연속적으로 입력받을 수 있다.
       c. [posein@www posein]$ cat read1
          #!/bin/bash
          echo "두 자연수를 입력받아 뺄셈을 하는 프로그램"
          echo "첫번째 자연수는?"
          read int1
          echo "두번째 자연수는?"
          read int2
          if [ $int1 -ge $int2 ]
          then
              expr $int1 - $int2
          else
              expr $int2 - $int1
          fi
          [posein@www posein]$ ./read1
          두 자연수를 입력받아 뺄셈을 하는 프로그램
          첫번째 자연수는?
          6
          두번째 자연수는?
          2
          4
       d. [posein@linux67 posein]$ cat read2
          #!/bin/bash
          echo "당신의 이름을 입력하세요?"
          read str
          echo $str
          [posein@linux67 posein]$ ./read2
          당신의 이름을 입력하세요?
          posein
          posein
   2) echo
    ㄱ. 설명: 해당문자열을 표준 출력에 표시하고 행바꿈을 한다. 만일 문자열이 없으면 행바꿈만
             한다.
    ㄴ. 사용법
       echo [option] [문자열]
    ㄷ. option
      -n : 출력결과에서 행바꿈을 하지 않는다.
      -e : escape문자를 사용할 수 있게 해준다.
    ㄹ. 사용예
     a. [posein@linux67 posein]$ echo HI!
        HI!
     b. [posein@www posein]$ echo -e "Yes\nNo"
        Yes
        No
     c. [posein@www shell]$ cat file6
        #!/bin/bash
        echo -n "ENTER A : "
        read A
        echo -n "ENTER B : "
        read B

        result1=`expr $A + $B`
        result2=`expr $A - $B`
        result3=`expr $A \* $B`
        result4=`expr $A / $B`
        result5=`expr $A % $B`

        echo "A + B = $result1"
        echo "A - B = $result2"
        echo "A * B = $result3"
        echo "A / B = $result4"
        echo "A % B = $result5"
        [posein@www shell]$ ./file6
        ENTER A : 6
        ENTER B : 2
        A + B = 8
        A - B = 4
        A * B = 12
        A / B = 3
        A % B = 0
   3) break
    ㄱ. 설명: for, while, until등의 순환문에서 빠져 나온다.
    ㄴ. 사용법
       break [n]
        => 순환문의 n번째루프에서 빠져나온다.
    ㄷ. 사용예
       [posein@www posein]$ cat br1
       #!/bin/bash
       rm -rf file*
       echo > file1
       echo > file2
       mkdir file3
       echo > file4
       for var in file*
       do
         if [ -d "$var" ]
         then
           break;
         fi
       done
       echo "directory name : $var"
       exit 0
       [posein@www posein]$ ./br1
       directory name : file3
   4) continue
    ㄱ. 설명: for, while, until등의 순환문을 계속해서 실행한다.
    ㄴ. 사용법
       continue [n]
         => n번째 루프를 나타내는 부분은 생략할 수 있다.
    ㄷ. 사용예
       [posein@www posein]$ cat co1
       #!/bin/bash
       rm -rf file*
       echo > file1
       echo > file2
       mkdir file3
       echo > file4
       for var in file*
       do
           if [ -d "$var" ]
           then
               continue
           fi
           echo "file name : $var"
       done
       exit 0
       [posein@www posein]$ ./co1
       file name : file1
       file name : file2
       file name : file4
   5) exit
    ㄱ. 설명: 상태 코드 n가 함께 스크립트를 종료한다. n은 0(성공)이나 0이 아닌 숫자(실패)가
             될 수 있다. 만일 n이 주어지지 않으면 가장 최근에 사용된 명령의 상태코드를 사용
             한다.
    ㄴ. 사용법
       exit [n]
   6) function
    ㄱ. 설명: 함수를 정의한다. 위치 매개변수($1, $2, -)가 명령어부분에서 사용가능하다.
    ㄴ. 사용법
       function 함수명
       {
         명령어
       }
    ㄷ. 사용예
       [posein@linux67 posein]$ cat myfunc
       # function myfunc
       {
         echo "parameter is $1"
       }
       [posein@linux67 posein]$ ./myfunc love
       parameter is love
   7) getopts
    ㄱ. 설명: 명령행 인자를 처리해 올바른지 점검한다. getopts명령은 주로 쉘스크립트 순환문에서
             사용되며 명령행 옵션이 표준 형식에 맞는지를 확인한다. 문자열에는 옵션을 나타내는
             문자들이 포함되며 스크립트가 실행될 때 getopts에 의해 처리한다. 적합한 옵션들은
             하나씩 처리되어 지정된 변수명에 저장된다.
    ㄴ. 사용법
      getopts 문자열 변수명
   8) return
    ㄱ. 설명: 함수정의에서 사용되며 함수가 종료될 때 상태코드 n을 반환한다. 만일 n이 생략되면
             직전에 실행된 명령 상태코드를 반환한다.
    ㄴ. 사용법
       return [n]
   9) set
    ㄱ. 설명: Shell에서 매개인자를 설정한다. 문자열을 공백으로 나누어진 필드로 출력할 때 유용
             하다.
    ㄴ. 사용법
       set 문자열
    ㄷ. 사용예
      a. [posein@www posein]$ set a b c
         [posein@www posein]$ echo $1 $2
         a b
      b. [posein@www posein]$ cat da1
         #!/bin/bash
         echo Date: $(date)
         set $(date)
         echo Date: $6년 $2 $3$1 $4
         exit 0
         [posein@www posein]$ ./da1
         Date: Thu Jul 4 23:36:22 KST 2002
         Date: 2002년 Jul 4Thu 23:36:22
   10) shift
    ㄱ. 설명
     a. 위치 매개변수를 n자리만큼 당긴다.
     b. 만일 n이 생략되면 기본적으로 1이 적용된다. 즉, $2는 $1으로 $3은 $2로 이동한다.
     c. 보통 매개 변수를 처음부터 끝까지 검색하는데 자주 사용한다.
    ㄴ. 사용법
       shift [n]
    ㄷ. 사용예
     a. [posein@www shiftdir]$ cat sh1
        #!/bin/bash

        while [ $# -gt 0 ]
        do
             echo "$# : $*"
             shift
        done
        [posein@www shiftdir]$ ./sh1 a b c
        3 : a b c
        2 : b c
        1 : c
     b. [posein@www shiftdir]$ cat sh2
        #!/bin/bash
        echo $#
        echo $1
        echo $2
        echo $3
        echo $4

        echo "____________________________"
        shift 2

        echo $#
        echo $1
        echo $2
        echo $3
        echo $4
        [posein@www shiftdir]$ ./sh2 a b c d
        4
        a
        b
        c
        d
        ____________________________
        2
        c
        d
     c. [posein@www posein]$ cat sh3
        #!/bin/bash
        echo Date: $(date)
        set $(date)
        while [ "$1" != "" ]
        do
          echo $1
        shift
        done
        exit 0
        [posein@www posein]$ ./sh3
        Date: Thu Jul 4 23:25:24 KST 2002
        Thu
        Jul
        4
        23:25:24
        KST
        2002
   11) source
    ㄱ. 설명: 파일을 읽고 실행한다. 파일이 반드시 실행가능할 필요는 없지만 PATH에 등록되어
             있어야 한다. 점(.)이 source와 같은 기능을 한다.
    ㄴ. 사용법
      source 파일 [인수]
      . 파일 [인수]
   12) eval!
    ㄱ. 설명: 인자의 값을 구하는데 사용
    ㄴ. 사용예
       [posein@www posein]$ cat ev1
       #!/bin/bash
       var1=10
       var2=var1
       eval! result='$'$var2
       echo $result
       [posein@www posein]$ ./ev1
       10
   13) expr
    ㄱ. 설명: 인자로 사용되는 표현식의 값을 구함
    ㄴ. 사용예
       var2=`expr $var +1`
   14) prinft
    ㄱ. 설명: 가장 최근의 shell에서만 사용가능한 명령어로 형식화된 출력을 할 때 사용한다.
    ㄴ. 사용법
       printf "format string" parameter1 parameter2
    ㄷ. format string의 변환식별자
       d : 십진수 출력
       c : 한문자 출력
       s : 문장 출력
       % : %문자 출력
    ㄹ. 사용예
     a. [posein@www posein]$ printf "%s\n" shell
        shell
     b. [posein@www posein]$ printf "%s %d\t%s\n" "shell programming" 100 gogo
        shell programming 100   gogo
   15) true
    ㄱ. 설명: 쉘 상에서 참의 의미를 가지는 0을 반환한다.
    ㄴ. 사용법
       true
    ㄷ. 특징
     a. 쉘 스크립트상에서 무한 루프를 만들 때 등의 경우 사용될 수 있다.
     b. Bourne 쉘 상에서 콜론문자(:)로 같은 효과를 얻을 수 있다. 보통 의미없는 널(Null).명령
    ㄹ. 사용예
     a. [posein@www posein]$ cat tr1
        #!/bin/bash
        while true
        do
          echo "over and over"
        done
     b. [posein@www posein]$ cat tr2
        #!/bin/bash
        rm -f file
        if [ -f file ]
        then
            :
        else
            echo "file did not exist"
        fi
        exit 0
        [posein@www posein]$ ./tr2
        file did not exist
(11) 쉘프로그래밍 기타사항
   1) 종료코드
     0          : 성공
     1 ~ 125    : 에러
     126        : 파일이 실행가능하지 않음
     128 ~ 255  : 시그널이 발생
      => Shell프로그래밍에서는 전역에러코드 변수없이 125개의 사용자 정의 에러코드를 사용할 수
        있다.
   2) 우선순위
    ㄱ. 앨리어스
    ㄴ. function, if, for같은 키워드
    ㄷ. 함수
    ㄹ. cd나 type과 같은 내장 명령
    ㅁ. 스크립트와 프로그램. PATH환경 변수에 들어있는 디렉토리를 쉘이 확인하여 실행한다.

우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
Tips! (1)
OpenSource (1)
«   2018/12   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
  1. 2012/12 (2)
  2. 2012/04 (3)
  3. 2012/03 (6)
  4. 2012/02 (6)
  5. 2012/01 (2)