2013-10-18 3 views
1

다른 이름 서버를 가진 여러 도메인이있는 웹 서버가 있는데 그 중 하나를 정리하려고합니다. 도메인 및 해당 이름 서버 목록을 가져 오려고합니다. 내가 작성이 간단한 스크립트를 가지고와 거의 작동합니다cli와 스크립트의 grep 동작이 다릅니다

의로
#!/bin/bash 
for f in `cat mydomains.txt` 
do 
    echo $f " " >> mydns.txt 
    dig ns $f | grep '^$f' | cut -d $'\t' -f 5 >> mydns.txt 
    echo "" >> mydns.txt 
done 

지금, 모든이가하는 echo $f " " >> mydns.txt입니다.

명령 줄에 $f이 있어야하는 것을 파고 선으로 대체하면 예상되는 결과가 나옵니다. 그러나 나는 내 대본에서 아무것도 얻지 못한다. 이전 줄에 $f을 반향 출력하기 때문에 $f 변수가 채워져 있다는 것을 알고 있습니다. 왜 스크립트에서 작동하지 않습니까?

답변

2

'^ $ f'에 대해 grep 하시겠습니까? 변수 주위에 틱이없는 '^' "$ f"이어야합니다. 그런 식으로 확장되지 않습니다.

+0

그게 다야! 고맙습니다. – Carnivoris

0

Windows 스타일/유닉스 스타일의 개행 문제 일 수 있습니다. \ r \ n 대신에 개행 문자를 \ n으로 변환하는 것이 도움이 될 수 있습니다.

여기에 제공된 dos2unix 제안을 시도해 보셨습니까? grep fails inside bash script but works on command line?

+0

이러한 파일은 Linux에만 만들어지며 Linux에만 존재합니다. Windows 개행 문자가 없습니다. – Carnivoris

+0

Linux에서 작성되었다고해서 반드시 텍스트 편집기가 개행에 CRLF를 사용하지 않는다는 의미는 아닙니다. 그럼에도 불구하고 문제의 해결책을 찾은 것을 기쁘게 생각합니다. ;) – Dan

2

작은 따옴표로 인해 쉘이 변수를 확장 할 수 없습니다. 나는 또한 dig 호출 $f 주위에 따옴표를 사용

dig ns "$f" | grep "^$f" | ... 

참고 : 큰 따옴표를 사용해야합니다. 변수를 인용하는 것은 좋은 습관입니다. 자세한 내용은 this other SO question을 참조하십시오.

관련 문제