DevOps/Shell

Shell Script - 6, Test

게임이 더 좋아 2022. 11. 24. 00:00
반응형
728x170

다음은 테스트다.

Test 는 [ 라고도 말한다.

[ 는 Test라고 말한다.

 

일반적으로 Test는 직접적으로 불릴 일이 거의 없다.

다만 [ 로는 많이 불린다.

 

[ 는 실제로 test의 symbolic link 이다.

그 이상 이하도 아니다.

즉, 쉘 스크립트에서 [ 를 test로 해석한다는 말과 같다.

 

예시를 보면서 알아보자



**재밌는게 which는 위치로 읽고 실제로 위치를 반환한다.

아재들이 좋아할듯zzzz

 

 
$ type [
[ is a shell builtin
$ which [
/usr/bin/[
$ ls -l /usr/bin/[
lrwxrwxrwx 1 root root 4 Mar 27 2000 /usr/bin/[ -> test
$ ls -l /usr/bin/test
-rwxr-xr-x 1 root root 35368 Mar 27  2000 /usr/bin/test



사실 [ 는 프로그램이다. ls처럼 작동한다는 말이다.

그렇기 때문에 공백으로 선언해주어야 한다.

공백을 두고 써야 한다는 말과 같다.




아래의 예에서 [는 공백없이 쓰였다.

if [$foo = "bar" ]

 

우선 이해는 못했겠지만 위에 문장이 작동할까? 알아보자



이것은 작동하지 않는다.

위의 라인은

아래와 같이 쓴 것과 같기 때문이다.

if test$foo = "bar" ]



다시 말해서 저 대괄호는 여는 괄호 없이 닫힌 괄호만 남아있게 된다.

그래서 공백을 넣어준다.

 

if [ "$foo" = "bar" ]

 

이렇게 넣어야 작동한다.

 

?? 근데 test를 왜 하는걸까??

 

test는 아까 말했듯이 직접적으로 불리지는 않는다.

if 나 while과 같이 쓰인다.

**if문도 끝날 때 fi를 쓴다.




이런 식이다.

 
#1
if [ ... ]
then
  # if-code
else
  # else-code
fi

#2
if [ ... ]; then
  # do something
fi



여기서 if 문과 then 문이 다른 라인에 있다는 것을 주목하자.

만약 같은 줄에 쓰고 싶다면 ;(semi-colon)으로 구분해줘야 한다.

 

만약 else if 같은 추가 조건을 쓰고 싶다면 아래와 같이 한다.

 
if  [ something ]; then
echo "Something"
elif [ something_else ]; then
  echo "Something else"
else
  echo "None of the above"
fi



test를 하는 이유는 역시 조건문에서 true, false 처럼

실행해서 exit code가 뭘로 나오는지를 구분하기 위해서다.

 

다시 말하자면

something 테스트가 성공하면 echo “something” 이 실행된다는 말과 같다.



예를 들어보자

우선 test할 쉘 스크립트를 만들어보자

 

아래의 예는 X를 가지고 test를 해본다.

밖에서 export X를 해서 갖고 놀아보자.

 

test.sh

 
#!/bin/sh
if [ "$X" -lt "0" ]
then
  echo "X is less than zero"
fi
if [ "$X" -gt "0" ]; then
  echo "X is more than zero"
fi
[ "$X" -le "0" ] && \
      echo "X is less than or equal to  zero"
[ "$X" -ge "0" ] && \
      echo "X is more than or equal to zero"
[ "$X" = "0" ] && \
      echo "X is the string or number \"0\""
[ "$X" = "hello" ] && \
      echo "X matches the string \"hello\""
[ "$X" != "hello" ] && \
      echo "X is not the string \"hello\""
[ -n "$X" ] && \
      echo "X is of nonzero length"
[ -f "$X" ] && \
      echo "X is the path of a real file" || \
      echo "No such file: $X"
[ -x "$X" ] && \
      echo "X is the path of an executable file"
[ "$X" -nt "/etc/passwd" ] && \
      echo "X is a file which is newer than /etc/passwd"



**여기에서 쓰인 백슬래시는 new line을 무시하기 때문에 라인이 끝나지 않았다는 말과 같다.

\가 은근히 가독성을 위해서 많이 쓰인다.

줄은 바꾸되, 코드는 그렇게 해석되지 않는다는 말과 같아서 그렇다.

 

**여기 쓰인 세미콜론도 if와 then을 같이 쓰기위해 종종 사용된다

**세미콜론을 정확하게 말하자면, mkdir test;cd test와 같이

앞의 명령어의 성공,실패와 상관없이 실행한다는 뜻을 가지고 있다.

 



또한 if문에서는 여전히 &&이나 || 와 같은 연산을 쓸 수 있다.

다만 !!

조금 다르다.

 

&&는 이전의 연산이 성공했을 때 실행한다는 뜻이다.

다시 말해서 앞의 명령어가 성공했을 때, && 다음 명령어를 실행한다는 뜻이다.

 

**그냥 &을 쓴다면 다른 뜻이다.

&는 명령어를 백그라운드로 실행할 때 사용한다.

 

||은 이전의 연산이 성공했을 때는 실행하지 않는다는 뜻이다.

다시 말해서 앞의 명령어가 성공한다면 || 뒤에는 실행하지 않는다.

 

아래와 같이 쓰면 된다.

test 문과도 같이 쓰일 수 있다.



 
#!/bin/sh
[ $X -ne 0 ] && echo "X isn't zero" || echo "X is zero"
[ -f $X ] && echo "X is a file" || echo "X is not a file"
[ -n $X ] && echo "X is of non-zero length" || \
      echo "X is of zero length"




근데 저렇게 복잡하게 쓸 바에는 if, elif, else 문을 쓰는 것이 훨씬 낫다.




test의 진가는 Shell Script를 조금 더 유연하게 만드는 데에 있다.

다시 말해서 variable을 쓰기 전에 체크할 수 있게 만드는게 test다.

 

 
echo -en "Please guess the magic number: "
read X
echo $X | grep "[^0-9]" > /dev/null 2>&1
if [ "$?" -eq "0" ]; then
  # If the grep found something other than 0-9
  # then it's not an integer.
  echo "Sorry, wanted a number"
else
  # The grep found only 0-9, so it's an integer.
  # We can safely do a test on it.
  if [ "$X" -eq "7" ]; then
    echo "You entered the magic number!"
  fi
fi

 

$? 라는 것은 아직 배우지 않았고, grep이란 것도 아직은 모르겠지만 grep은 앞의 명령어와 조합되어 유용하게 작동한다는 것만 우선 알아두고

 

[^0-9] 는 메타 문자이며

>/dev/null 2>&1

는 입력에 대한 출력을 하지 않겠다는 의미며 여러가지 것들이 있다.

차차 알아보도록 하자.





다른 예시를 보자

 

test2.sh

 
#!/bin/sh
X=0
while [ -n "$X" ]
do
  echo "Enter some text (RETURN to quit)"
  read X
  echo "You said: $X"
done



실행해볼까?

 

 
$ ./test2.sh
Enter some text (RETURN to quit)
fred
You said: fred
Enter some text (RETURN to quit)
wilma
You said: wilma
Enter some text (RETURN to quit)

You said:
$



while에만 test가 붙는게 아니라 밑에서도 변수를 체크하면서 test를 할 수 있다.

 

 
#!/bin/sh
X=0
while [ -n "$X" ]
do
  echo "Enter some text (RETURN to quit)"
  read X
  if [ -n "$X" ]; then
    echo "You said: $X"
  fi
done
728x90
반응형
그리드형

'DevOps > Shell' 카테고리의 다른 글

Shell Script - 8, Variable(2)  (0) 2022.11.24
Shell Script - 7, Case  (0) 2022.11.24
Shell Script - 5, Loop  (0) 2022.11.23
Shell Script - 4, escape character  (0) 2022.11.23
Shell Script - 3, Wildcard  (0) 2022.11.23