1993.1.3

SUBJECT: C shell, Bourne shell에서의 테스트 방식 비교

MEANING OF THIS MEMO
shell program시 흔히 조건 테스트로 사용하는 flag와 operator에 대해
C shell, Bourne shell 양 쪽의 것을 비교해 보았다.

CONTENTS:
0. "test" command에 대하여
1. C shell에서의 테스트 방식
2. Bourne shell에서의 테스트 방식
3. C shell, Bourne shell의 테스트 비교
4. 참고 - Operator의 비교

DESCRIPTION:

0. "test" command에 대하여

   * "test" command(이하 "test"로 생략함)는 원래 user command로 존재하는 것이다.
     syntax를 보면,
     +-----------------------------+
     |    % test       | 
     +-----------------------------+
     을 test하여 그 값이 참이면 0 을 return하고
     거짓이면 1 을 return한다.

   * 은 logical하게 크게 두 가지 요소로 표현 된다.
     ① Primitives  
           "-b ", "-c "의 syntax를 가진다.
           에 대해 -의 의미를 test하라는 것이다.
           아래 표에서 구체적으로 살펴볼 것이다.
     ② Operators 
           앞의 Primitive들을 연결하는데 사용된다.
           - Unary Operator  :   ! (logical NEGATION)
           - Binary Operator :  -a (logical AND)
                                -o (logical OR)
           - ( )             :  grouping을 위한 것으로
                                괄호 안에는 이 들어 간다.

1. C shell에서의 테스트 방식
   * "test"의 man page를 보면 알 수 있듯이
     상당 부분의 Primitive들이 csh의 경우 built-in 되어 있다.
   * 따라서 C shell programming시에는 built-in된 comand로 테스트토록 하고
     built-in command에 없는 것을 테스트하려는 경우
     "test"의 Primitive들을 사용하면 될 것.
     테스트와 관련한 C shell의 built-in command들은 아래 표 참조.

2. Bourne shell에서의 테스트 방식
   * 이 "test"는 C shell 보다는 Bourne shell에서 더욱 자주 사용되는데,
     이는 Bourne shell에 테스트를 위한 built-in command가 빈약하기 때문이다.
   * Bourne shell에서 "test"를 사용할 때 "test" syntax를 따르기 보다는
     "test"와 같은 의미로 사용되는 "[" (물론 "]"도 함께)를 사용한다. 
     여러 Bourne shell script들에서 if와 함께 나오는 "["를 자주 보는데, 이는
     Bourne shell '조건문 if의 syntax'가 아니라 "test"의 대용이라는 점을 주지하시압. 
   * C shell에서 "["를 사용하여 테스트를 수행하려면,
     "["과 "]"는 backslash로 escape되어야 한다.
     example)  if { \[ -r filename \] } then
     


3. C shell, Bourne shell의 테스트 비교
                                                   +------------+------------+
   +-------+---------------------------------------| C shell    |  "test"    |
   | 대 상 |      테  스  트      의    미         | (built-in) |  command   |
   +=======+=======================================+============+============+
   |       |                                       |          Flag           |
   |       |                                       +=========================+
   |       |  directory                            |            -d           |
   |       |  file                                 |            -f           |
   |       |  file or directory exists             |    -e                   |
   |       |  owned by the executing user          |    -o                   |
   |       |  current user can read                |            -r           |
   | File  |  current user can write               |            -w           |
   |       |  current user can execute             |            -x           |
   |       |  exists and size > 0                  |            -s           |
   |       |  size is 0                            |    -z                   |
   |       |  block device                         |                  -b     |        
   |       |  character device                     |                  -c     |        
   |       |  named pipe                           |                  -p     |        
   |       |  set-uid-bit set                      |                  -u     |        
   |       |  set-gid-bit set                      |                  -g     |        
   |       |  stiky bit set                        |                  -k     |        
   |       |  n은 terminal의 file descriptor       |                  -t n   |      
   +-------+---------------------------------------+=========================+
   |       |                                       |        Operator         |
   |       |                                       +=========================+
   |       |  NULL                                 |    ==            -z     | ⓐ
   |String |  not NULL                             |    !=            -n     | ⓑ
   |       |  equal                                |    ==            =      |
   |       |  not equal                            |    !=            !=     |
   |       |  match wildcard pattern               |    =~                   | ⓒ
   |       |  not match wildcard pattern           |    !~                   | ⓓ
   +-------+---------------------------------------+-------------------------+
   |       |  equal                                |    ==            -eq    |
   |       |  not equal                            |    !=            -ne    |
   |Number |  less than                            |     <            -ne    |
   |       |  greater than                         |     >            -gt    |
   |       |  less than equal                      |    <=            -le    |
   |       |  greater than equal                   |    >=            -ge    |
   +-------+---------------------------------------+-------------------------+
   |       |  logical AND                          |    &&            -a     |
   | 논 리 |  logical OR                           |    ||            -o     |
   |       |  logical NEGATION                     |            !            |
   +-------+---------------------------------------+-------------------------+

   * Flag의 경우 사용 syntax를 보면, flag 뒤에 filename을 주면 된다.
   * Operator의 경우 사용 syntax를 보면,
     unary operator(단항 연산자)인 "!"을 제외하고는
     모두 binary operator(이항 연산자)이므로
     operator 양쪽에 string(or pattern), number를 주면 된다.

   * ⓐ에서 사용 syntax를 보면,
               C shell의 경우 : string == ""
               "test"의 경우  : if test -z "$string"
   * ⓑ에서 사용 syntax를 보면,
               C shell의 경우 : string != ""
               "test"의 경우  : if test -n "$string"
   * ⓒ에서 사용 syntax를 보면, string =~ pattern
   * ⓓ에서 사용 syntax를 보면, string !~ pattern



4. 참고 - Operator의 비교
   * C shell의 operator들은 모두 built-in된 것들이다.
   * Bourne shell의 operator들 중
     관계 연산자와 논리 연산자들은 앞서 언급했던 것처럼
     "test"에서 빌려다 사용한다는 것을 상기하시라.

   +-----------------------------+----------------+----------------+
   |    Operator    종   류      |    C shell     | Bourne shell   |
   +=============+===============+================+================+
   |             |               |       <               -lt       |
   |             | Number only   |       >               -gt       |
   |             |               |       <=              -le       |
   |             |               |       >=              -ge       |
   | Relational  |---------------+----------------+                |
   | Operator    | Number or     |       ==       |      -eq       |
   |             |       String  |       !=       |      -ne       |
   |             |---------------+----------------+----------------+
   |             | String only   |       =~                        |
   |             |               |       !~                        |
   +-----------------------------+---------------------------------+
   |                             |       &&              -a        |
   |    Logical Operator         |       ||              -o        |
   |                             |                !                |
   +-----------------------------+---------------------------------+
   |                             |                +                |
   |                             |                -                |
   |    Arithmetic Operator      |                *                |
   |                             |                /                |
   |                             |                %                |
   +-----------------------------+---------------------------------+
   |                             |       =                         |
   |                             |       +=                        |
   |    Assignment Operator      |       -=                        |
   |                             |       *=                        |
   |                             |       /=                        |
   |                             |       %=                        |
   +---------------------------------------------------------------+





Revision History
Created        on Jan. 3 ,1993