2011-11-12 5 views
3

Bash 스크립팅에서 부울 변수를 평가하려고하지만 항상 false를 반환합니다. 난 항상 if 문으로 이동, 실행 여부를 얻는다 "장치 발견"여부Bash 스크립팅 : 부울 변수가 제대로 작동하지 않습니다.

DEVICE_FOUND=false 
tmp=`adb devices | tail -n+2 | awk '{print $1}'` 

echo "$tmp" | while read line 
do 
    if [ "$DEVICE_ID" = "$line" ] 
    then 
     echo "Found a device" 
     DEVICE_FOUND=true 
    fi 
done 

if ! $DEVICE_FOUND 
then 
    echo "ERROR: The device "$DEVICE_ID" is not connected" 
    exit 
fi 

: 여기

는 코드입니다. DEVICE_FOUND = true 일 경우, 마지막으로 실행하면 안됩니다.

왜 그런지 이해가 안됩니다.

아무도 알고 계십니까?

대단히 감사합니다.

답변

7

. 서브 쉘의 변수 값은 상위 쉘로 다시 전파되지 않습니다. 서브 쉘 제거 :

while read line 
do 
    ... 
done <<< "$tmp" 
+0

대단히 감사합니다! 이 작품! – Jary

1

배쉬에는 부울 변수가 없습니다. 따라서 DEVICE_FOUND=falsefalse$DEVICE_FOUND에 할당합니다.

"빈 변수"조건을 "거짓"으로 사용하고 "비어 있지 않은 변수"를 "참"(또는 원하는 경우 반전 표시)으로 사용하거나 기타 임의로 검사하여 일반적인 부울 플래그 기능을 사용할 수 있습니다 값. 예 : 서브 쉘에서, 즉 | 후 진정한 가치를 설정하고 있기 때문이다

DEVICE_FOUND="" 
tmp=`adb devices | tail -n+2 | awk '{print $1}'` 

echo "$tmp" | while read line 
do 
    if [ "$DEVICE_ID" = "$line" ] 
    then 
     echo "Found a device" 
     DEVICE_FOUND=true 
    fi 
done 

if [ ! "$DEVICE_FOUND" ] 
then 
    echo "ERROR: The device "$DEVICE_ID" is not connected" 
    exit 
fi 
+0

덕분에 많은.이상한데, 나는 아직도 그 오류를 얻고있다! – Jary

+0

장치를 찾았습니다 오류 : 장치 HT91MLD00464가 연결되어 있지 않습니다 – Jary

+0

'true'와'false'는 bash 내장입니다. 코드에 원래 버그와 동일한 버그가 있습니다. 내 대답을 참조하십시오. – choroba

0

떠들썩한 파티에는 부울 유형 (및 POSIX 호환 쉘)이 없습니다. 무엇을 효과적으로 발생하면 (실패 상태로 종료 반드시하지 0) (반드시 0, 성공 상태로 종료) 또는 falsetrue을 실행 외부 명령if 문된다는 것입니다. 첫 번째 목록이 0 인 경우 if 문은 두 번째 목록을 실행합니다. true 또는 false 명령을 사용할 수 없거나 예상 한 것과 다르게 작동하는 시스템이있을 수 있습니다. "정수"값 (모든 값은 내부적으로 문자열 임) 또는 빈/비어 있지 않은 문자열 값을 대신 사용하십시오.

보조 노트에

,이 사항을 고려하십시오

adb devices | tail -n +2 | awk '{print $1}' | while read … 
do 
    … 
done 
+0

서브 쉘은 이것이 실패하는 (+1) 이유에 대한 더 많은 설명이 될 것이지만 나는 더 많은 참조를 위해 나의 대답을 남겨 둘 것이다. – PointedEars

3

문제는 부울 아니다, 그것은 while 루프는 파이프 라인에 있는지, 그리고 따라서 서브 쉘에서 실행합니다. 서브 쉘에서 DEVICE_FOUND를 변경해도 메인 쉘의 DEVICE_FOUND에는 아무런 영향을 미치지 않으며 false로 유지됩니다.

while read line 
do 
    if [ "$DEVICE_ID" = "$line" ] 
    then 
     echo "Found a device" 
     DEVICE_FOUND=true 
    fi 
done < <(echo "$tmp") 

나 :

while read line 
do 
    if [ "$DEVICE_ID" = "$line" ] 
    then 
     echo "Found a device" 
     DEVICE_FOUND=true 
    fi 
done <<<"$tmp" 
당신이 떠들썩한 파티를 사용하는 경우 (스크립트의 시작 부분에있는 오두막이 #!/bin/bash하지 #!/bin/sh 경우 예), 파이프를 제거하는 몇 가지 방법이있다

그러나이 특별한 경우 (모든 정규식 메타 문자가없는 $DEVICE_ID 제공) 더 나은 방법이있다 :

if echo "$tmp" | grep -q "^$DEVICE_ID\$"; then 
    echo "Found a device" 
else 
    echo "ERROR: The device "$DEVICE_ID" is not connected" 
    exit 
fi 
관련 문제