[Shell Script] 명령어 치환(command substitution)의 결과가 있는지 없는지 조건문에서 확인하기

명령어 치환(command substitution)의 결과가 있는지 없는지를 조건문에서 확인할 수 있는데 이에 대해 알아보자


환경

  • Linux
  • Bash shell(/bin/bash)


상황 및 방법

상황

  • 아래처럼 쉘 스크립트에서 명령어 치환(command substitution)의 결과가 있는지 없는지를 조건문에 사용해야할 상황
  • 명령어 치환(command substitution)이란 서브쉘(subshell)을 사용해서 명령어의 결과를 가져와 대체하는걸 말한다.
#!/bin/sh

result=$(ls -al | grep sample)
...


방법

  • 아래와 같은 조건문 형식을 사용하면 된다.
  • -z 옵션을 사용해서 처리를 다르게 할 수 있다.
  • (방법 1) 조건문 안에 변수만 넣고 확인해 볼 수 있으며 크기가 0이거나 없다면 거짓이다.
  • (방법 2) -z 옵션을 사용할 수 있으며 다음에 오는 변수의 크기가 0이거나 없다면 참이다.
#!/bin/sh

result=$(ls -al | grep sample)

# Return true if its length is not zero.
if [ "${result}" ]
then
    echo "result is not empty"
else
    echo "result is empty"
fi

# Checks if the given string operand size is zero; if it is zero length, then it returns true.
if [ -z "${result}" ]
then
    echo "result is empty"
else
    echo "result is not empty"
fi


예제

  • 파일에 특정 문자열이 있는지 확인하고 없으면 추가
  • 여기서 파일은 있다고 가정
$ cat test.txt
String
$ vi test.sh
#!/bin/sh

set -e

set +e
result=$(cat test.txt | grep "test string")
set -e

if [ -z "${result}" ]
then
    echo "test string" >> test.txt
fi
$ chmod +x test.sh
$ ./test.sh
$ cat test.txt
String
test string


기타

  • grep 명령어의 경우 줄이 하나라도 생기면 0, 한 줄도 안생기면 1 그리고 오류에 대해서는 2를 종료 상태로 반환한다. 그렇기 때문에 set -e 옵션을 쓸 경우 쓰기전에 제거하고 다시 설정해줘야한다.
  • 참고: https://www.gnu.org/software/grep/manual/grep.html#Exit-Status
...
set +e
result=$(ls -al | grep sample)
set -e
...


참고자료