[Bash] test

pingping·2021년 2월 20일

test

Operators

  • File tests
  • String Tests
  • Arithmetic Tests
  • 기타 문법

[1] File 테스트

  • 파일의 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

[2] String 테스트

-z <STRING> : 스트링이 zero (empty)면 True

-n <STRING> : 스트링이 not zero ( not empty)면 True

<STRING1> = <STRING2> : 두 스트링 값이 같으면 True

<STRING1> != <STRING2> : 두 스트링 값이 다르면 True

<STRING1> < <STRING2> (( 사용할 때 escape 필요 ))

<STRING1> > <STRING2> (( 사용할 때 escape 필요 ))

[3] Arithmetic 테스트

test 명령의 산술 연산자는 기본적으로 정수값만 다룬다.

<INTEGER1> -eq <INTEGER2>

<INTEGER1> -ne <INTEGER2>

<INTEGER1> -le <INTEGER2>

<INTEGER1> -ge <INTEGER2>

<INTEGER1> -lt <INTEGER2>

<INTEGER1> -gt <INTEGER2>

[4] 기타 문법

 <TEST1> -a <TEST2>

 <TEST1> -a <TEST2>

 ! <TEST>

 ( <TEST> )

: 사용할땐 escape

 -v <VARIABLENAME> : 변수가 존재하는지 테스트

: 존재하지 않는 상태 (unset 상태) 면 1 을, 그 외에는 0 을 리턴

Tips

비교하는 변수는 quote 해야 한다.

$ 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 해줘야 한다.

숫자를 비교할 때 -gt, -ge 등으로 비교하자.

$ [ 100 \> 2 ]; echo $?
1

$ [ 100 -gt 2 ]; echo $?
0

AND, OR 비교

  • [ 명령에서는 and, or 연산자로 -a, -o 를 제공하지만 &&, || shell 메타 문자를 이용해 분리하여 작성할 수도 있다.
#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 ...

Logical NOT

# '[' 명령에서 사용되는 '!'
if [ ! test1 ]; then ...

# shell logical NOT 키워드를 이용
if ! [ test1 ]; then ...

Array 비교 시 * 사용하기 !

@ : 개개의 원소를 " " 하여 나열

  • : 모든 원소를 하나의 " " 안에 넣어 나열

⇒ 그러므로 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
profile
Cloud Infra Engineer & interested in python, IaC, k8s

0개의 댓글