2010-06-29 6 views
1

문자열이 텍스트 파일에없는 경우 일부 셸 명령을 실행하려고합니다. 이 줄을 명령 줄에 붙여 넣으면 오류가 발생합니다.쉘 명령 - 명령의 출력을 기반으로 한 조건?

if [ $(cat textfile.txt | grep "search string") -eq "" ]; then; echo "some string"; fi; 

오류 : 당신은 그냥 사용할 수 있도록,

-bash: [: -eq: unary operator expected 

답변

5

당신은 = 대신 -eq 사용해야합니다. 또한 따옴표가 필요합니다. cat이 필요하므로 grep는 인자로 파일 이름을 취할 수

if [ "$(cat textfile.txt | grep 'search string')" = "" ]; then; echo "some string"; fi; 

참고. grep의 리턴 값을 직접 사용할 수도 있습니다. grep은 검색 문자열이 없으면 1을 리턴합니다.

if [ "$(grep 'search string' textfile.txt)" ]; then 
    echo "some string"; 
fi 

더욱 간단한 방법은 논리 및 &&을 사용하는 것입니다.

grep "search string" textfile.txt && echo "some string" 
+0

따옴표를 변경할 필요가 없습니다. 이것은 완벽하게 유효한 bash입니다 :' "$ (cat textfile.txt | grep"검색 문자열 ")" – Tyilo

1

0을 반환됩니다 grep 명령 요청 된 라인은 (1 그렇지 않은 경우,이 오류가있는 경우) 발견 된 경우 :

grep "search string" textfile.txt >/dev/null 2>&1 
if [[ $? -ne 0 ]] ; then 
    echo 'Not found' 
fi 

이 실제로 인 경우 문자열을 사용하고 싶지 않으므로 (사용하지 않아야 함)에 대한 인수가 너무 많아서는 안됩니다.명령 : 당신이 비교 []를 사용하는 경우

if [ "$(cat textfile.txt | grep 'search string')" == "" ] ; then 
    echo "It's not there!" 
fi 
+0

내가 downvote하지 못했지만, 당신의 대답은 최적의 거리가 멀다 : 거기 grep'은'-q' 옵션이'때문에 재 지정을 할 필요도없고, 배쉬 수 '$? '에 의지하지 않고 명령의 반환 값을 테스트하십시오. – Philipp

+0

괜찮습니다, 필립. 모든 greps이 그런 옵션을 가지고있는 것은 아니며 (나는 아직도 몇몇 유닉스와 함께 작업한다) 어쨌든 효율성을위한 쉘 스크립팅은 아니다.나는 당신의 대답을 내 (현대) 스크립트에 통합 할 것입니다. – paxdiablo

2
grep -F -q -e 'search string' textfile.txt || echo 'Not found' 

참고 :

  • -F 정규 표현식으로 검색 문자열의 해석을 방지 할 수 있습니다.
  • -q은 모든 출력을 억제하고 첫 번째 인스턴스가 발견 된 직후 반환하므로 문자열이 큰 파일의 시작 부분에서 발생하면 검색 속도가 훨씬 빨라집니다.
  • -e은 패턴을 명시 적으로 지정하여 대시로 시작하는 패턴을 허용합니다.
  • 변수 대체를 원하지 않으면 작은 따옴표를 사용하십시오.
+0

우아함. 어딘가에 누군가가 bash를 perl'[[$ ('불행히도. – msw

1

이 경우 대괄호가 필요하지 않습니다. [은 실제로 명령이므로, 명령을 사용할 위치에서 모든 명령을 사용할 수 있습니다. 여기서는 grep을 사용할 수 있습니다. grep은 파일 이름을 인수로 사용할 것이므로 cat을 사용할 필요가 없습니다. 또한 세미콜론이 너무 많습니다.

if grep -q "search string" textfile.txt; then echo "some string"; fi 

또는

if grep "search string" textfile.txt > /dev/null 2>&1; then echo "some string"; fi 
관련 문제