awk: 1행: > 또는 근처에서 구문 오류가 발생했습니다.

awk: 1행: > 또는 근처에서 구문 오류가 발생했습니다.

위의 구문 오류가 발생하지만 무엇이 문제인지 해독할 수 없습니다. BASH에서 부동소수점 값을 수행하려고 합니다.

그래서 나는 awk목표를 달성하기 위해 호출된 이 명령을 사용했습니다.

while $empty; do
    empty=false
    echo -n "Price : "; read getPrice

#float value using awk
awk 'BEGIN{if ('$getPrice'>'0') exit 1}'
    if [ $? -eq 1 ]; then
    PRICE[$COUNT]=$getPrice;

else
    empty=true 
    echo "Please put in the correct price figure!"
fi

done

그러나 이 오류가 발생했습니다.

awk: 1행: > 또는 근처에서 구문 오류가 발생했습니다.

getPrice이 오류는 변수에 값을 입력 하지 않았을 때 발생합니다. 그런데 어떤 값을 입력하면 잘 동작합니다 >0. 많은 생각을 해본 후에도 여전히 구문의 문제점을 이해하지 못합니다. 인사.

답변1

Awk 스크립트에서 구문 오류가 발생하는 이유는 $getPrice비어 있을 때 스크립트가 실제로는

BEGIN{if (>0) exit 1}

쉘 변수를 Awk 변수로 Awk 스크립트로 가져오는 올바른 방법은 다음을 사용하는 것입니다 -v.

awk -vprice="$getPrice" 'BEGIN { if (price > 0) exit 1 }'

또한 스크립트의 제어 흐름을 살펴보았는데 $empty변수를 사용하는 대신 올바른 가격을 입력한 후 루프를 종료할 수 있습니다.

while true; do
    read -p 'Price : ' getPrice

    # compare float value using awk
    if awk -vprice="$getPrice" 'BEGIN { if (price <= 0) exit(1) }'
    then
      PRICE[$COUNT]="$getPrice"
      break
    fi

    echo 'Please put in the correct (positive) price figure!' >&2
done

댓글 후 추가 세부정보:

입력한 값이 숫자가 아니거나 음수인 경우 입력이 유효하지 않다는 경고를 사용자에게 알려야 합니다. 입력 값에 있어서는 안되는 문자(0~9와 소수점을 제외한 모든 문자)가 있는지 테스트할 수 있습니다.

while true; do
    read -p 'Price : ' getPrice

    if [[ ! "$getPrice" =~ [^0-9.] ]] && \
        awk -vprice="$getPrice" 'BEGIN { if (price <= 0) exit(1) }'
    then
        PRICE[$COUNT]="$getPrice"
        break
    fi

    echo 'Please put in the correct (positive) price figure!' >&2
done

답변2

비어 있으면 $getPrice이 줄

awk 'BEGIN{if ('$getPrice'>'0') exit 1}'

~이 되다

awk 'BEGIN{if (>0) exit 1}'

이것은 당신이 원하는 것이 아닐 수도 있습니다. null이 아닌 값을 제공하기 위해 쉘 대체 중 하나를 사용할 수 있습니다(비록 쉘과 awk를 다음과 같이 혼합하는 것은 권장되지 않습니다):

awk 'BEGIN{if ('${getPrice:-0}'>'0') exit 1}'

옵션을 사용하여 awk에 변수를 전달하는 것이 더 좋습니다 -v(그러나 이것은 실제로 다른 질문이며 여러 번 답변되었습니다).

답변3

아무것도 없으면 코드는 다음과 같습니다 getPrice.awk

BEGIN{if (>0) exit 1}

이는 완전히 잘못된 구문입니다. null이 되는 것을 방지합니다 getPrice(또는 어떤 종류의 숫자인지 확인하는 것이 더 좋습니다).

bash실제로 요구 사항이 있습니까? 이는 ZSH 또는 부동 소수점을 지원하는 모든 언어에서 더 쉬울 것입니다.

bash-3.2$ exec zsh
% echo 3.14 | read x; [[ $x -gt 0 ]] && echo positive
positive
% exec tclsh
tclsh> set x [read stdin]
3.14
3.14

tclsh> if {$x > 0} { puts positive }
positive
tclsh> 

관련 정보