2011-11-21 3 views

답변

1

먼저 grep을 수행하고 그 결과를 변수에 저장하십시오. 그런 다음 무언가가 반환되는지 확인하십시오 (예 : wc). 그렇다면 grep 결과와 함께 루프를 실행하십시오.

+0

이것은 가장 간단하고 와드 솔루션에 가장 적합합니다. 감사합니다 : D – jwbensley

+0

bash에서 KISS 원칙은 다른 언어 (물론 perl은 제외)보다 훨씬 더 많이 보유하고 있습니다 ... – mouviciel

1

루프 내부에서이를 수행 할 수 없습니다. 루프 내에서 플래그를 true로 설정하거나 인수의 수를 확인하십시오. 그렇지 않으면

for NAME in $(grep "name" $people) 
do 
    echo "Name is ${NAME}" 
    false 
done && echo "no names found" 

다음 for 블록이 (가 false를 루프에 합격하지 않으며이라고 결코 의미) 0의 리턴 코드가있는 경우

set -- `grep "$name" people` 
case $# in 0) echo no names found >&2;; 
    *) for Name; do # special form - loop over $* 
     echo name is "$Name" 
    done ;; 
esac 
+0

나는이 방법 tripleee를 좋아해 case 문을 사용하여 좋은 방을 남겨두고 대신 수행 할 수있는 추가 검사를 추가합니다. 단지 "데이터가 있습니다", "데이터가 없습니다". 비록 내가 받아 들인 대답이 가장 단순하고 직접적인 대답 이었지만, 나는 이것을 좀 더 복잡한 다른 스크립트에서 시도 할 것이라고 생각한다. 고마워! – jwbensley

4

디버그 텍스트를 인쇄 할 compound conditional test (&&) 추가

! for NAME in $(grep "name" $people) 
do 
    echo "Name is ${NAME}" 
    false 
done || echo "no names found" 
+0

논리는 일종의 거꾸로입니다. 나는 어딘가에 전술상의 부정으로 바로 잡을 수 있다고 생각한다. – tripleee

+0

나는이 접근법을 매우 좋아한다, 고마워. 그것은 저에게이 문제의 논리를 보는 새로운 방법을 가르쳐주었습니다. 그러나 삼중 쌍이 말했듯이, 조금 거꾸로 말하면서, 다른 사람들이 제 대본을 쉽게 읽을 수 있기를 바랍니다. – jwbensley

+0

(아마도?)로 수정하면 더 정확하게 보이게됩니다. –

1

이 당신을 위해 작동 있습니다 : 그것은 읽는 방법처럼, 단지의 반전

- -n가 표준 출력에 기본 출력을 방지 설명 :
sed -n '/name/{h;s//name is &/p};${x;/./!s/^/no names found/p}' $people 

$people을 가정은 적어도 하나의 라인

EDIT의 파일입니다. 파일 $people의 각 줄에 name을 검색하고 공백 (HS)을 복사 할 줄이 발견되면 값과 인쇄물 앞에 name is을 붙입니다. 마지막 라인에서 HS로 스왑하고 아무 것도 출력하지 않는 경우 no names found.

배시 대안이다

names=($(grep "name" $people)) 
((${#names[@]})) && printf "name is %s\n" "${names[@]}" || printf "no names found\n" 

EDIT가 : grep 출력 배열 names 채우기. names 배열의 크기를 테스트하고 0이 아닌 경우 각 값 앞에 name is을 붙이고 출력 결과는 no names found입니다.

+0

감사합니다. 나는 총 sed newb 그래서 나는 당신이 제공하고 그것을 100 % 이해하는 예제를 읽을 수 없습니다. 그러나, 당신을 bash 대안을 읽는 것은 매우 감동한다, 그것은 굉장하다! 이것은 나에게 상황의 논리와 배쉬에 대한 새로운 시각을 주었다. D : 대단히 감사합니다. – jwbensley

관련 문제