배시스크립트에 if []구문에 관한 질문입니다.

pok의 이미지

DNS에 새로운 네임서버를 추가하고 싶은데 있으면 추가 안하려합니다.

if grep $DNS /etc/resolv.conf
then echo already
else echo nameserver $DNS >> /etc/resolv.conf
fi

이렇게 해서 사용하고 있습니다. 그런데, []구문이랑 어떻게 다르나요?
그러니까...
if [ "grep $DNS /etc/resolv.conf" ]
then echo already
else echo nameserver $DNS >> /etc/resolv.conf
fi

는 작동을 안하는것 같은데, 어떤이유인지요?
그리고 if에 관련된 여러 팁들도 부탁드리겠습니다.
7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

따옴표로 둘러싸서 그렇습니다.

"grep $DNS /etc/resolv.conf"

익명 사용자의 이미지

그런데 따옴표를 안하면 다음과 같은 에러가 납니다.

pok@ubuntu:~$sudo ./net-test 1.1.1.1
./net-test.sh: line 4: [: 1.1.1.1: binary operator expected
pok@ubuntu:~$
lifthrasiir의 이미지

pok wrote:
DNS에 새로운 네임서버를 추가하고 싶은데 있으면 추가 안하려합니다.
if grep $DNS /etc/resolv.conf
then echo already
else echo nameserver $DNS >> /etc/resolv.conf
fi

이렇게 해서 사용하고 있습니다. 그런데, []구문이랑 어떻게 다르나요?
그러니까...
if [ "grep $DNS /etc/resolv.conf" ]
then echo already
else echo nameserver $DNS >> /etc/resolv.conf
fi

는 작동을 안하는것 같은데, 어떤이유인지요?
그리고 if에 관련된 여러 팁들도 부탁드리겠습니다.

if 문은 그 뒤에 딸려 있는 인자를 새로운 명령으로 보고 그 반환값에 따라서 분기를 합니다. [] 구문 역시 [라는 특수한 프로그램이 있기 때문에 가능한 겁니다. (절대로 특수한 문법이 있는 게 아닙니다)

[ "grep $DNS /etc/resolv.conf" ] 라고 하면 [] 안의 내용이 수식(이나 뭐 그런 것들)으로 해석되고 그 결과에 따라 반환값이 달라집니다. 하지만 grep $DNS /etc/resolv.conf라는 부분은 따옴표를 치건 안 치건 올바른 수식이 아니기 때문에 [] 안에 쓸 수 없으며, 그냥 if grep ... 식으로 써야 합니다.

- 토끼군