Bash 변수 범위


87

마지막 "echo"문이 비어있는 이유를 설명해주십시오. 나는 다음과 같은 성명 대신 ++ XCODE 방법

XCODE=`expr $XCODE + 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 

: 나는 그것이 하나의 값으로 while 루프에서 증가 된 것으로 예상 while 문 밖. 나는 여기서 변수 범위에 대해 뭔가 빠졌다고 생각하지만 ol 'man 페이지는 나에게 그것을 보여주지 못한다. 당신은 while 루프로 배관하고 있기 때문에 이러한 변화가

  0

어디에서 XCODE를 초기화 할 수 있습니까? 23 sep. 082008-09-23 21:57:56

  0

while 문 밖에서 코드의 맨 위에 "XCODE = 0"을 던지려고했습니다. 23 sep. 082008-09-23 21:59:21

  0

날카로운 부분이 없으면 작동합니다. #!/bin/bash for i in 1 2 3 4 5; do echo $ ((++ XCODE)) done echo "fin :"$ XCODE 여러분의 문제는 변수 범위 지정과 그 동안 일어나는 일과 관련이 없다고 생각합니다. 23 sep. 082008-09-23 22:08:23

  0

동의합니다 .. "while read"루프와 관련이있는 것처럼 보입니까? 23 sep. 082008-09-23 22:11:27

91

을 도와 주면

  0

의미가 있습니다 .. 고마워요. 함수가 나를 위해가는 길인 것처럼 보입니다. 23 sep. 082008-09-23 22:36:03

+1

이것은 단지 내가 겉으로보기에 무작위적인 문제들 중 bash 스크립팅으로 인해 많은 것을 대답했다. 27 jan. 152015-01-27 14:29:10

  0

이 완벽한 대답은 나에게 너무나 혼란스럽고 CI 시스템에서 실제로 이상한 행동을 설명합니다. 06 apr. 172017-04-06 08:29:48


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

보고, 하위 쉘은 while 루프를 실행하기 위해 작성됩니다. 이제이 하위 프로세스는 자신의 환경 사본을 가지며 변수를 부모 프로세스로 되돌려 보낼 수 없습니다 (유닉스 프로세스 에서처럼).

따라서 루프로 파이프되지 않도록 구조 조정이 필요합니다. 또는 예를 들어 함수에서 실행하고 하위 프로세스에서 반환 할 값을 표시 할 수 있습니다.

http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL

  0

이렇게하면 마지막 echo 문에 대해 "0"이 인쇄됩니다. 그러나 나는 값이 1이 아닌 것으로 기대한다. 또한, 왜 수출의 사용? 나는 그것을 환경으로 강요한다고 가정합니까? 23 sep. 082008-09-23 22:09:59


93

문제는 파이프와 함께 넣어 프로세스 (따라서 자신의 환경이) 서브 쉘에서 실행된다는 것이다. while 내에서 발생하는 모든 작업은 파이프 외부에 영향을 미치지 않습니다.

구체적인 예는 다음 서브 쉘로부터 파일로 결과는 그것을 판독

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

또는 다른 옵션 출력 아마도

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

브릴리언트. 나는 <전에 구문을 보지 못했기 때문에 읽어야 할 것이다. 그러나 이것은 일을 처리한다. 시작 명령이 아니라 끝 부분에 입력 명령을 넣는 것이 이상하게 느껴지지만 작동합니다. 31 oct. 082008-10-31 19:32:03

+3

필자도'<(command)'문법을 알지 못했기 때문에 많은 시간과 두통을 덜어주었습니다. 당신에게 큰 +1 : 30 jan. 132013-01-30 12:29:39

+26

전체 <() 문법이 (내가 그랬던 것처럼) 무엇인지 혼란스러워하는 사람들을 위해, 그것은 "프로세스 대체"라고 불리며, 위에서 상세히 설명한 사용법은 여기에 본 : http://mywiki.wooledge.org/ProcessSubstitution 19 feb. 132013-02-19 14:53:46

  0

* 고마워 *이 내가 정확히 무엇을 찾고 있었는지! 04 apr. 142014-04-04 03:37:17


0

에 파이프를 재 기입함으로써 해결 될 수있다 부모 껍질.

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

3

또 하나의 옵션과 같은 :

#!/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 사용할 수 있습니다 대신 xsel -i -p

  0

./scraper.sh : 줄 111 : xsel : 명령을 찾을 수 없음 ./scraper.sh : 줄 114 : xsel : 명령을 찾을 수 없음 19 apr. 162016-04-19 01:57:49

  0

@ 3kstc 분명히 xsel을 설치하십시오. 또한 xclip을 사용할 수도 있지만 사용법은 조금 다릅니다. 여기에서 요점 : 첫 번째는 출력을 클립 보드 (리눅스에서 3 개)에 넣고, 두 번째는 거기에서 꺼내서 stdout으로 보냅니다. 09 may. 162016-05-09 20:43:39


4

xclip -i -selection clipboard 을 (에코하면서이 같은 서브 쉘에 있기 때문에)이 잘 작동해야합니다

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

0
내가 만들 때 나는이 문제를 가지고

내 자신의 작은 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") 

요점은 내 SUM 변수와 while을 포함하는 subshell을 만듭니다. 그러나 나는 그 자체로 대신에 전체()로 파이프를 썼다.