ifの2つの条件(正数のみ可能、文字不可)

ifの2つの条件(正数のみ可能、文字不可)

文字/単語ではなく正数のみを許可するスクリプトを作成する必要があります。

私は2つのif条件を作成しましたが、一緒に動作しません。 1つを削除すると、もう1つはうまく機能します。どのように接続しますか?

    if [[ ${@:2} -lt 0 ]]; then
        shift
        echo "error, only positive"
        exit 3
    fi

    if [[ ${@:2} == [a-zA-Z] ]]; then
        echo "error, no letters allowed"
        exit 4
    fi

私のスクリプトは次の行で実行されます。 ./script.sh file.txt arg1 arg2 arg3 ... したがって、arg1、arg2は-1またはaにはできません。

答え1

おそらくすべてのパラメータを繰り返し、それぞれをテストする必要があります。両方をテストできる場合は、次のようにできます。これにより、すべてのパラメータに数字のみがあることを確認できます(したがって、または-文字はありませんが文字はありません。小数点以下)

pattern='[^0-9]'
for arg; do
    if [[ $arg =~ $pattern ]]; then
        printf 'Unacceptable option: %s\n' "$arg"
        exit 3
    fi
done

別々のテストに異なるエラーメッセージと終了コードが含まれるようにするには、forループとテストでこれを実行できますarg。これにより、各コマンドラインオプションが順番に表示されます。

答え2

次のようにbash比較演算子を利用することもできます。

if [ $arg -eq $arg -a $arg -ge 0 ] 2>/dev/null ;then  
  echo "accepted"
else 
  echo "not accepted"
fi 

秘密は、2つの引数を-eqと比較すると、bashがエラーを生成することです(私たちは/ dev / nullに送ります)。

関連情報