programing

Bash 변수 범위

iphone6s 2023. 4. 12. 21:53
반응형

Bash 변수 범위

왜 마지막인지 설명해 주세요echo스테이트먼트가 비어있습니까?그런 것 같아요XCODE는 while loop에서 값이 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 스테이트먼트 이외에는 인쇄되지 않습니다.가변범위에 대해 뭔가 놓친 것 같은데, 올맨페이지에 표시되지 않네요.

while 루프에 파이프 연결 중이기 때문에 while 루프를 실행하기 위한 하위 셸이 생성됩니다.

이제 이 자식 프로세스에는 자체 환경 복사본이 있으므로 다른 Unix 프로세스와 마찬가지로 변수를 부모에게 다시 전달할 수 없습니다.

따라서 루프에 배관되지 않도록 재구성해야 합니다.또는 함수에서 실행할 수도 있습니다.echo하위 프로세스에서 반환할 값.

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

내가 내 작은 듀를 만들 때 이걸 극복했어.

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" )

요점은 SUM 변수와 while을 포함하는 ( )을 사용하여 서브셸을 만들지만 while 자체가 아니라 전체 ( )로 파이프로 연결하여 gotcha를 회피하는 것입니다.

 #!/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)

언급URL : https://stackoverflow.com/questions/124167/bash-variable-scope

반응형