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
'programing' 카테고리의 다른 글
| 외부 DLL 파일을 저장할 위치 (0) | 2023.04.12 |
|---|---|
| SQL에서 최소 두 개의 값 가져오기 (0) | 2023.04.12 |
| 포스트그레스 자동 증가 카운터 재설정 (0) | 2023.04.12 |
| VBA: 조건부 - 아무것도 아니다 (0) | 2023.04.12 |
| EF Code First의 계산된 열 (0) | 2023.04.12 |