문제

마지막 "에코"진술이 왜 비어 있는가? 나는 그것이 while 루프에서 1의 값으로 증가했을 것으로 기대한다.

#!/bin/bash
OUTPUT="name1 ip ip status" # normally output of another command with multi line output

if [ -z "$OUTPUT" ]
then
        echo "Status WARN: No messages from SMcli"
        exit $STATE_WARNING
else
        echo "$OUTPUT"|while read NAME IP1 IP2 STATUS
        do
                if [ "$STATUS" != "Optimal" ]
                then
                        echo "CRIT: $NAME - $STATUS"
                        echo $((++XCODE))
                else
                        echo "OK: $NAME - $STATUS"
                fi
        done
fi

echo $XCODE

++ Xcode 메소드 대신 다음 문을 사용해 보았습니다.

XCODE=`expr $XCODE + 1`

그리고 그것은 또한 while 진술 밖에서 인쇄되지 않을 것입니다. 나는 여기에 가변 범위에 대해 뭔가를 놓치고 있다고 생각하지만 Ol 'Man 페이지는 나에게 그것을 보여주지 않습니다.

도움이 되었습니까?

해결책

while 루프에 배관하기 때문에 하위 쉘이 while 루프를 실행하도록 만들어집니다. 이제이 아동 프로세스에는 자체 환경 사본이 있으며 변수를 부모에게 전달할 수 없습니다 (UNIX 프로세스에서와 같이).

따라서 루프에 배관하지 않도록 재구성해야합니다. 또는 예를 들어 함수에서 실행하여 하위 프로세스에서 반환하려는 값을 반영 할 수 있습니다.

http://tldp.org/ldp/abs/html/subshells.html#subshell

다른 팁

문제는 파이프와 함께하는 프로세스가 서브 쉘에서 실행되므로 고유 한 환경이 있다는 것입니다. 무슨 일이 있어도 while 파이프 외부에 아무런 영향을 미치지 않습니다.

특정 예제는 파이프를 다시 작성하여 해결할 수 있습니다.

while ... do ... done <<< "$OUTPUT"

아니면 아마도

while ... do ... done < <(echo "$OUTPUT")

이것은 (에코와 동일한 서브 쉘이기 때문에) 다음과 같아야합니다.

#!/bin/bash
cat /tmp/randomFile | (while read line
do
    LINE="$LINE $line"
done && echo $LINE )

하나 더 옵션 :

#!/bin/bash
cat /some/file | while read line
do
  var="abc"
  echo $var | xsel -i -p  # redirect stdin to the X primary selection
done
var=$(xsel -o -p)  # redirect back to stdout
echo $var

편집 : 여기에서 XSEL은 요구 사항입니다 (설치). 또는 xClip을 사용할 수 있습니다. xclip -i -selection clipboard대신에 xsel -i -p

 #!/bin/bash
 OUTPUT="name1 ip ip status"
+export XCODE=0;
 if [ -z "$OUTPUT" ]
----

                     echo "CRIT: $NAME - $STATUS"
-                    echo $((++XCODE))
+                    export XCODE=$(( $XCODE + 1 ))
             else

echo $XCODE

이러한 변경이 도움이되는지 확인하십시오

또 다른 옵션은 결과를 서브 쉘에서 파일로 출력 한 다음 부모 쉘에서 읽는 것입니다. 같은 것

#!/bin/bash
EXPORTFILE=/tmp/exportfile${RANDOM}
cat /tmp/randomFile | while read line
do
    LINE="$LINE $line"
    echo $LINE > $EXPORTFILE
done
LINE=$(cat $EXPORTFILE)

나는 내 자신의 작은 du를 만들 때 이것을 다루었 다 :

ls -l | sed '/total/d ; s/  */\t/g' | cut -f 5 | 
( SUM=0; while read SIZE; do SUM=$(($SUM+$SIZE)); done; echo "$(($SUM/1024/1024/1024))GB" )

요점은 내 합계 변수를 포함하는 ()와 함께 서브 쉘을 만들지 만 gotcha를 피하는 것은 그 자체로 전체 () 대신 전체 ()에 파이프를 넣는다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top