0

引数の 1 つとしてf文字列値を取るBash functionがあります。s

sの間の整数でない場合は、実行を中止する必要があり[1000-9999]ます。

最初は、文字列を int にキャストし、結果に対して算術範囲チェックを実行して、エラーが発生した場合に中止しようと考えていましたが、他のすべてのパラメーターは RegEx を使用してチェックされるため、一貫性が保たれる可能性があります。実際、私はしなければなりません。

バッシュのバージョン: 4+

これより見栄えの良いパターンを思い付くことができませんでした。

[[ "$s" =~ [[:\<:]][[:digit:]]{4}[[:\>:]] ]]

上記のパターンチェック構造の可読性を改善するのを手伝ってもらえますか?

上記のパターンで特に嫌いなのは、次のとおりです。

  • <バックスラッシュで単語境界文字をエスケープする必要があります[[:\<:]]
  • それの長さ、そして非常識な数の角括弧

私が持っていた 1 つのアイデアは、ハックですが、フルラインの境界チェックを使用することでした。(つまり、\b...\b ではなく ^...$ を使用)


オプションで:: Bash での引数検証のためのかなり確立されたパターンはありますか?

4

3 に答える 3

2

bash整数比較を行うことができます:

shopt -s extglob # Needed for the extended pattern +(...)
f () {
    if [[ $1 == +([[:digit:]]) ]] &&
       (( $1 >= 1000 && $1 < 10000 )); then
    ...
    fi
}
于 2013-03-10T13:46:40.307 に答える
2

また、私は試してみます:

[[ $s =~ ^[1-9][0-9]{3}$ ]]

そうでなけれ0999ば合格するでしょう。しかし、それ+1234はおそらく有効な入力である可能性があり、おそらく1234.0..

于 2013-03-10T10:59:51.023 に答える
1

http://mywiki.wooledge.org/BashFAQ/054を参照してください。

パターンマッチのみを使用してこれを行うこともできますが、私はそれを分割します。このようなものは、「通常の」方法に近いと言えます。

f() {
    if [[
        $1 == +([[:digit:]]) &&
        "$1 >= 1000 && $1 < 10000" -ne 0
        ]]
    then
        ...
    fi
}

Bash/ksh テスト式複合コマンドでは、数値比較演算子の引数は算術式として評価されます。二重引用符は、式内の空白を許可します。そうしないと、パーサーは一部の算術演算子とテスト式の演算子を区別できません。左の式が であるかどうかのテストは、0基本的に と同等(())です。これは、1 つのコマンドのみを使用することを除いて、@chepner のanswerと同じです。これでパフォーマンスが少し向上すると思いますが、私は文法に慣れているので、かなり明確です。他の方法を好む人もいます。[[算術演算子は((、他のテストと組み合わせる場合にのみ使用してください。

予測不可能な入力を算術式として使用する前に、まず検証する必要があります。次に、それが特定の範囲内にあるかどうかを確認できます。他にも方法はありますが、個人的にはこんな感じです。それは明確で、この問題のすべての順列に対して機能します。

また、入力に 8 進数または 16 進数のリテラルが含まれている可能性がある場合は、さらに処理が必要になることも付け加えておきます。その場合、通常、入力を実行するprintf %dとうまく機能します。

于 2013-03-10T11:38:03.367 に答える