2010-02-24 3 views
4

을 종료하지 않지만 :루프는 결코 내가 bash는 함께 일하고 있어요 나는 이런 식으로 뭔가를 할 노력하고있어

A=1 
while [ $A=1 ]; do 
    read line 
    echo $line | grep test >/dev/null 
    A=$? 
    echo $A 
done 

이 스크립트 결코 grep을 성공적으로 완료하고 A를 0으로 무엇 오전 설정된 경우에도 종료 내가 누락 된거야? 아래 출력 샘플입니다.

$ ./test.sh 

자위대

1 

시험

0 

HM ...

1 
,
+0

$ : 당신은 나오지도 같은 텍스트 처리 도구를 활용하면

while read line; do if [[ "$line" =~ test ]] && break # do something with $line done 

은 물론이 더 단순화 할 수있다 :의 한 줄은 정규식 '시험'과 일치 할 때까지 생각이 라인을 처리하는 가정 해 봅시다 A = 1은 $ A를 1로 설정하지 않습니다. =는 비교 연산자로 작동하지만 잘못된 유형입니다 ... 또한 공백은 올바르지 않습니다 – Dancrumb

답변

8

당신은 올바른 비교 연산자를 사용해야합니다. 배쉬는 정수와 문자열 비교에 대해 서로 다른 연산자를 가지고있다.

은 또한, 올바른 간격에 필요 비교 식입니다.

당신은

while [ $A -eq 1 ]; do 

에 대한 here를 참조해야합니다
5

나는 Bash의 구문이 꽤 끔찍한 것을 발견했다. -

[$ A -eq 1] ...?

1을 $ A 또는 그 이상한 것으로 재 할당하려고 시도했을 수 있습니다.

+2

이거나 적어도 피연산자와'= '연산자 사이에 공백을 넣습니다 . – mouviciel

+1

= 기호는이 인스턴스에서 여전히 비교이지만 ... 문자열 비교입니다. 공백은 결정적인 측면입니다. – Dancrumb

+0

@Dancrumb는 사람들을 잘 알기 쉽습니다 (나는 많은 bash 프로그래밍을하지 않습니다!) 감사합니다, Andy. –

4

시도 :

while [ $A -eq 1 ]; do 
+5

공백을 넣지 않고 질문에 쓰면 공백이 없으므로 테스트 연산자는 '0 = 1'이 빈 문자열인지 여부를 확인하고 있으므로 테스트가 통과되어 루프가 계속되지 않습니다. –

-1

당신이

 
while [ $A == "1" ] 
    .... 
done 

편집을 시도하지 않은 : 으악를 나는 기꺼이 내 실수를 인정하고 그에 따라이 편집 한 내 오류를 언급 때문에 - 감사합니다 hea ds up ...

 
while [ $A -eq 1 ] 
    .... 
done 

죄송합니다. :( 희망이, 안부, 톰을하는 데 도움이됩니다.

+0

그것은 문자열 비교 연산자입니다. 정수 비교 연산자가 아닙니다. – Dancrumb

+0

@Dancrumb : OP가 bash 스크립트에서 문자 입력을 읽고 있습니다 ... 정수가 아닙니다 ... 설명 할 필요가 없다면? 귀하의 의견을 보내 주셔서 감사합니다! :) – t0mm13b

+0

확실합니다. 이 스크립트는 $ A에서 grep에 대한 호출의 리턴 코드를 넣기 때문에 값은 0이나 1 인 숫자가됩니다. – Dancrumb

1

대신이 작업을 수행 할 수 있습니다. 외부 grep을 호출 할 필요가 없습니다.

+0

흥미 롭습니다. 단일 괄호는 무엇을합니까? 왜 두 개의 세미콜론이 필요합니까? 케이스/esac 구조의 일부인 –

+0

. http://tldp.org/LDP/abs/html/testbranch.html을 참조하십시오. – ghostdog74

3

대부분의 대답은 정수/문자열 및 간격 문제에 초점을 두었지만 괜찮 았지만 코드는 IMO에서 완전히 다시 정리해야한다는 점에서 매우 독창적 인 것처럼 보입니다.

sed -e '/test/,$d' 
관련 문제