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以外の値を提供するために、シェル置換の1つを使用できます(シェルとawkを次のように混在させることはお勧めできません)。

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

オプションを使用してawkに変数を渡す方が良いでしょう-v(しかしこれは実際には別の質問であり、何度も答えられました)。

答え3

何もなければ、コードは次のようになりますgetPriceawk

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> 

関連情報