파일의 drwxrw-rw- 이런 모드 값을 가지고 판단한다.
간단한 예시
파일이며 실행 가능한지 파악하기
if [ -f "$file" -a -x "$file" ]; then ... fi
-e : 파일이 존재하면 True
-f : 파일이 존재하고 regular 파일이면 True
-d : 파일이 존재하고 directory이면 True
-b : 파일이 존재하고 block special 파일이면 True
-S : 파일이 존재하고 socket이면 True
-L : 파일이 존재하고 Symbolic link이면 True
-h : 파일이 존재하고 Symbolic link이면 True
-x : 파일이 존재하고 Executable하면 True
-r : 파일이 존재하고 Readable하면 True
-s : 파일이 존재하고 사이즈가 0보다 크면 True
-w : 파일이 존재하고 Writable하면 True
-z <STRING> : 스트링이 zero (empty)면 True
-n <STRING> : 스트링이 not zero ( not empty)면 True
<STRING1> = <STRING2> : 두 스트링 값이 같으면 True
<STRING1> != <STRING2> : 두 스트링 값이 다르면 True
<STRING1> < <STRING2> (( 사용할 때 escape 필요 ))
<STRING1> > <STRING2> (( 사용할 때 escape 필요 ))
test 명령의 산술 연산자는 기본적으로 정수값만 다룬다.
<INTEGER1> -eq <INTEGER2>
<INTEGER1> -ne <INTEGER2>
<INTEGER1> -le <INTEGER2>
<INTEGER1> -ge <INTEGER2>
<INTEGER1> -lt <INTEGER2>
<INTEGER1> -gt <INTEGER2>
<TEST1> -a <TEST2>
<TEST1> -a <TEST2>
! <TEST>
( <TEST> )
: 사용할땐 escape
-v <VARIABLENAME> : 변수가 존재하는지 테스트
: 존재하지 않는 상태 (unset 상태) 면 1 을, 그 외에는 0 을 리턴
$ AA="" # 변수 AA 값은 null
$ [ -n $AA ]; echo $? # null 이 아니여야 true 인데 결과로 true 가 나왔습니다.
0
$ [ -n "$AA" ]; echo $? # 변수를 quote 해주니 정상정인 값이 나왔습니다.
1
$ AA="aa bb"
$ if [ -n $AA ]; then
echo "$AA"
fi
bash: [: too many arguments
$ [ "$AA" = "$BB" ]; echo $?
0
⇒ 위의 예시에서 알 수 있듯이 [ 명령을 사용할 때는 항상 변수를 quote 해줘야 한다.
$ [ 100 \> 2 ]; echo $?
1
$ [ 100 -gt 2 ]; echo $?
0
#1. shell 메타문자를 이용해 분리해 사용
if [ test1 ] && [ test2 ]; then ...
if [ test1 ] || [ test2 ]; then ...
#2. { ;} 를 이용해 우선순위 조절
if [ test1 ] || { [ test2 ] && [ test3 ] ;} then ...
----------------------------------------------------
if [ test1 -a test2 ]; then ...
if [ test1 -o test2 ]; then ...
#3. 우선순위 조절을 위해 `( )` 를 사용할때는 shell 메타문자와 충돌하므로 escape 합니다.
if [ test1 -a \( test2 -o test3 \) ]; then ...
# '[' 명령에서 사용되는 '!'
if [ ! test1 ]; then ...
# shell logical NOT 키워드를 이용
if ! [ test1 ]; then ...
@ : 개개의 원소를 " " 하여 나열
⇒ 그러므로 array를 test 혹은 [ ] 에서 비교할 때 *를 사용해야 한다 → 하나의 argument로 인식하기 때문에
ubuntu@ip-10-0-1-215:~$ [ "${AA[*]}" = "${BB[*]}" ]; echo $?
0
ubuntu@ip-10-0-1-215:~$ echo ${AA[*]}
11 22 33
ubuntu@ip-10-0-1-215:~$ echo "${AA[*]}"
11 22 33
ubuntu@ip-10-0-1-215:~$ [ "${AA[@]}" = "${BB[@]}" ]; echo $?
-bash: [: too many arguments
2
- [ ] 의 확장 버전이다. 차이점은 무엇일까?
- [ ] : 명령 ( test 와 같음 )
- [[ ]] : shell keyword
⇒ 키워드이기 때문에 일반 명령들과 달리 shell에서 자체적으로 해석
⇒ 여러 제약사항 없이 편리하게 사용 가능
# escape 하지 않아도 됨
ubuntu@ip-10-0-1-215:~$ [[ a < b ]]; echo $?
0
ubuntu@ip-10-0-1-215:~$ [[ a > b ]]; echo $?
1
# 사용되는 변수를 quote 하지 않아도 값을 올바르게 인식
ubuntu@ip-10-0-1-215:~$ AA=""
ubuntu@ip-10-0-1-215:~$ [[ -n $AA ]]; echo $?
1
ubuntu@ip-10-0-1-215:~$ [[ -n "$AA" ]]; echo $?
1