上記の構文エラーが発生しますが、何が問題であるかを復号化できません。 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
何もなければ、コードは次のようになります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>