Bashスクリプトの変数の桁数が4桁を超えるかどうかをテストします。

Bashスクリプトの変数の桁数が4桁を超えるかどうかをテストします。

以下のように変数が4桁以上かどうかをテストしたいと思います。

#!/bin/bash
if [ $input has more than 4 digits ]; then 
     echo "  * Please only 4 digits" >&2
     echo""
else
   the other option
fi

ベストアンサー1

(数値ではなく)ビット数に興味がある場合は、Bash / Ksh / Zshの正規表現と一致させることができます(*脚注を参照[[:digit:]]

#!/bin/bash
input=$1
re='^[[:digit:]]{1,4}$'
if [[ $input =~ $re ]]; then
    echo "'$input' contains 1 to 4 digits (and nothing else)"
else
    echo "'$input' contains something else"
fi

または、たとえば、[[ $input =~ ^[[:digit:]]{5,}$ ]]「5つ以上の数字(他の数字なし)」などを確認します。


caseまたは、純粋なPOSIXシェルではパターンマッチングを使用する必要があります。

#!/bin/sh
input=$1
case $input in 
    *[![:digit:]]*) onlydigits=0;; # contains non-digits
    *[[:digit:]]*)  onlydigits=1;; # at least one digit
    *)              onlydigits=0;; # empty
esac

if [ $onlydigits = 0 ]; then
    echo "'$input' is empty or contains something other than digits"
elif [ "${#input}" -le 4 ]; then
    echo "'$input' contains 1 to 4 digits (and nothing else)"
else
    echo "'$input' contains 5 or more digits (but nothing else)"
fi

(すべてのロジックを中に入れることができますがcaseifそこに入れ子にするのは私の考えには少し見苦しいです。)


これは[[:digit:]]現在のロケールの「数値」の概念と一致する必要があります。これはASCII番号を超えることも、超えないこともあります0123456789。私のシステムでは、[[:digit:]]⁴(上付きの4、U + 2074)は一致しませんが、[0-9]一致します。他の「数字」を一致させることは問題になる可能性があります。シェルの数に対して算術演算を実行する場合。したがって、より厳密に適用するには、[0123456789]ASCII番号のみを許可を使用してください。

おすすめ記事