bash は文字列が金額かどうかをテストします。

bash は文字列が金額かどうかをテストします。

私はやや自由な形式のcsvファイルで作業しており、コスト項目を効率的に見つける必要があります。より良い解決策は、各行の特定の列数をテストすることです。次のことを試みましたが(GNU bash、バージョン5.0.17)は機能しません(「ドルの金額」は返されません)。

#!/bin/bash
input=$1
if [[ $input == [\$]?[0-9][\,]?[0-9]*[\.]?[0-9]{2}?$ ]]
then
echo "Is a dollar amount"
else
echo "Is NOT a dollar amount"
fi

ドル記号、カンマ、ピリオドを(角かっこなしで)エスケープしてみましたが、それも機能しません。ドル記号を含む引数を一重引用符で囲みます(必須)。 ==を=~に変更しましたが、「ドル金額」と報告された可能性が多すぎます。ウェブ上で同様のものを検索することはほとんど不可能です。私は何が間違っていましたか?私が書いた内容が次の意味だと思いました。

  • 先行ドル記​​号はオプションです。 - [$]?
  • 少なくとも1桁の数字が必要です - [0-9]
  • カンマはオプションです - [,]?
  • 追加の数字はいくらでも受け入れられます - [0-9]*
  • ピリオドはオプションです。 - [.]?
  • 2つの追加番号があるかもしれませんが、これもオプションです。 - [0-9]{2}?
  • 最後の2桁の後に何もない - $

ベストアンサー1

=~テストの代わりに演算子を使用したい場合がありますが、afterは==使用できません。?{2}

「数字がないか2桁」と言う正しい方法はです([0-9]{2})?

あなたが終わるのは

if [[ $input =~ ^\$?[0-9],?[0-9]*\.?([0-9]{2})?$ ]]; then ...; fi

ここでは、式を行の先頭に固定し、^不要な角かっこも削除しました。

文字列のオプション部分が独立してオプションでない場合は、その部分を括弧で囲む必要があります。たとえば、次のようになります。

if [[ $input =~ ^\$?[0-9](,[0-9]+)?(\.[0-9]{2})?$ ]]; then ...; fi

カンマがある場合は、カンマの後に少なくとも1桁を、ドットがある場合は、ドットの後に少なくとも2桁が必要です。

おすすめ記事