출처 : http://stone.backrush.com/sunfaq/z00010.html
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