2013-12-13 3 views
0

"IF"구문과 함께 매우 간단한 bash 스크립트를 작성하고 있습니다. 나는 전에 많은 것을 썼지 만, 어떤 이유로 "$ {hitA1} == 0"인수를 읽지 않습니다. $ {hitA1}은 파일에서 읽히고 실제로 읽는 것이며 실제로는 0과 같습니다. 대신 "$ {hitA1}! = 0"의 두 번째 인수로갑니다. 어떤 아이디어?인수가 읽히지 않는 경우

코드 :

배쉬와
CorHitA1=0 
MissA1=0 
for i in 44 50 53 58 71 
do 
    late=`expr $i + 1` 
    hitA1=`sed -n ${i}p _TMP_Acc1.txt` 
    hitlateA1=`sed -n ${late}p _TMP_Acc1.txt` 
    if [[ ${hitA1} == 0 ]]; then 
     echo "HEY!!!!!" 
     CorHitA1=`expr ${CorHitA1} + 1` 
    elif [[ ${hitA1} != 0 ]]; then 
     echo "Nope..." 
     echo ${hitA1} 
    fi 
    echo "CorHitA1 = " ${CorHitA1} 
done 
+1

'set -x'를 (#!/bin/bash 다음에) 스크립트 상단에 추가하십시오. 그것은 당신에게 잘못된 것을 알기 쉽게 디버깅 출력을 줄 것입니다. –

+0

스크립트를 실행할 때 실행을 추적하기 위해 스크립트 상단에'set -x'를 추가하십시오. 그렇다면 가치는 무엇입니까? 'if (($ {hitA1} == 0));을 사용해보십시오. then # yes; else # nope; fi'라고 표시합니다. –

+0

다른 [답변] (http://stackoverflow.com/questions/669452/is-preferable-over-in-bash-scripts#answer-669486)은'[[...]]'는 POSIX가 아니라고 말합니다 호환 - 다른 플랫폼에서 bash 스크립트가 있다면 작동하지 않을 수 있습니다. –

답변

0

, 당신은 산술 시험 ((을 사용해야합니다

if ((hitA1 == 0)); then ... 

(산술 평가와 함께, 당신은 $을 필요로하거나 당신이 인용 필요하지 않습니다 변수)

또는 -eq 연산자는 [[ :

과 함께 사용할 수 있습니다.
if [[ $hitA1 -eq 0 ]]; then ... 

위 중 하나를 수행하지 않으며, 당신이 추출하고있는 파일의 라인이 == 문자열 평등하기 때문에, 다음 [[ $hitA1 == 0 ]]는 false를 돌려줍니다 거기에 공백이 있고, 공백을 문자열이 아닌 경우 없는 문자열과 동일합니다.

+0

나는'if ((hitA1 == 0));를 사용했다. 그 다음에 ... ') 구문 오류 : 잘못된 산술 연산자 (오류 토큰은 " – user3100107

+0

@user3100107 : bash 스크립트를 편집하는 데 Windows 편집기를 사용하지 마십시오. 캐리지 리턴 문자, 윈도우'CRLF' 라인 종료 프로토콜의 일부 .' dos2unix' 또는 일부를 사용하여 제거하십시오 : 또한 어떤 버전의 bash를 사용하고 있습니까? – rici

관련 문제