POSIXシェルスクリプトで変数が整数であるかどうかを確認する方法(周囲の空白の問題を防ぐ)

POSIXシェルスクリプトで変数が整数であるかどうかを確認する方法(周囲の空白の問題を防ぐ)

is_integer ()長い間、私のPOSIX関数は次のようになりました。

#!/bin/sh
is_integer ()
{
    [ "$1" -eq "$1" ] 2> /dev/null
}

ところで、今日は見つけました。壊れた。数字の周りに空白があると、驚くべきことに計算がうまくいきますが、trueこの問題をどのように解決するのかわかりません。


正しい(予想される)動作の例:

is_integer 123と評価されますtrue

誤った(予期しない)動作の例:

is_integer ' 123'としても評価truefalseただし、明らかに先行スペースが含まれているため、この場合、関数はとして評価されると予想されます。


POSIX準拠の提案のみを提供してください。ありがとうございます。

ベストアンサー1

#!/bin/sh
is_integer ()
{
    case "${1#[+-]}" in
        (*[!0123456789]*) return 1 ;;
        ('')              return 1 ;;
        (*)               return 0 ;;
    esac
}

POSIX組み込み関数のみを使用してください。+1整数でなければならないかは仕様では明確ではなく、そうでない場合は行+から削除されますcase

仕組みは次のとおりです。${1#[+-]}オプションの先行記号を削除します。数字以外のものを含む以外は何も残さないように整数ではありません。整数でない場合は整数です。

編集:文字クラスを無効にするために^を!に変更しました。 @LinuxSecurityFreakに感謝します。

おすすめ記事