[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
...
참고자료
- https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
- https://en.wikipedia.org/wiki/Command_substitution
- https://www.tutorialspoint.com/unix/unix-string-operators.htm
- https://stackoverflow.com/questions/12137431/test-if-a-command-outputs-an-empty-string
- https://www.cyberciti.biz/faq/unix-linux-bash-script-check-if-variable-is-empty/
- https://www.gnu.org/software/grep/manual/grep.html#Exit-Status