Bashスクリプトのパラメータがすべて数値文字列であることを確認してください。

Bashスクリプトのパラメータがすべて数値文字列であることを確認してください。

これバッシュFAQ説明する

単純な「数値文字列」を検証するには、globを使用してこれを実行できます。

# Bash
if [[ $foo = *[!0-9]* ]]; then
    echo "'$foo' has a non-digit somewhere in it"
else
    echo "'$foo' is strictly numeric"
fi

私は「ああ、これは素敵でシンプルに見えますね」と思いました。次に、最初のエコーの後に「exit 1」を追加し、次のように変更したことを$foo除いて、スクリプトに正しく貼り付けました。$1

if [[ $1 = *[!0-9]* ]]; then
    echo "'$1' has a non-digit somewhere in it"
    exit 1
else
    echo "'$1' is strictly numeric"
fi

それからこれを実行して取得しようとしています。

$ sh foo.sh bar
bar
foo.sh: 6: [[: not found
'bar' is strictly numeric

私はBash文盲と言うのは恥ずかしいので、ここで何が間違っているのかわかりません。支持された感じを受けました。オンラインバッシュマニュアル正規表現に一致する演算子はですが、=~これを変更しても違いはありません。私が知っている限り、ここで問題の演算子は標準のようです。との違いは何であるかはわかりませんが、どちらもテスト式に対応してい[[ます[[ ]][ ]私はDebianスクイーズとバッシュを使っています。

$ bash --version
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)

Debian は version について話しています4.1-3

ベストアンサー1

shそれがbashスクリプトなら、なぜ呼び出すのですか?明らかに、システムではshbashではなく、Bourne / POSIXファミリーの他のシェルです。実はそうですスプリント、低メモリ消費と速度のために設計された小さなシェルで、ほぼ排他的にサポートしています。POSIX構成および組み込みユーティリティ。

[[ … ]]Bashとzshでは採用されているがPOSIXでは採用されていないBourne構文のksh拡張。ポータブルスクリプトでは[ … ]テストに必要です。標準構成はパターンマッチングをサポートしていません。標準的なイディオムは以下を使用することです。case構造:

case $1 in                        # branch to the first pattern that $1 matches
  *[!0-9]*)                       # pattern = anything containing a non-digit
    echo not a number             # do this if the first pattern triggered
    ;;                            # end of this case branch
  *)                              # pattern = anything (else)
    echo successor of $(($1-1))   # do this if the second pattern triggered
    ;;                            # end of this case branch
esac                              # end of the case construct

以下は、引数がすべて数値であるかどうかをテストする関数です。

is_all_digits () {
  case $1 in *[!0-9]*) false;; esac
}

余談:もともと上記のコード片にタイプミスがありました$(($0-1))。これにより、奇妙に見えるエラーメッセージが表示されました。

$ ash foo.sh 42
foo.sh: 4: arithmetic expression: expecting EOF: "foo.sh-1"
$ ash ./foo.sh 42
./foo.sh: 4: arithmetic expression: expecting primary: "./foo.sh-1"
$ ksh ./foo.sh 42
./foo.sh: line 3: foo.sh: invalid variable name
$ pdksh ./foo.sh 42
./foo.sh[4]: ./foo.sh-1: unexpected `.'
$ bash foo.sh 42         
foo.sh: line 3: foo.sh-1: syntax error: invalid arithmetic operator (error token is ".sh-1")
$ bash ./foo.sh 42
./foo.sh: line 3: ./foo.sh-1: syntax error: operand expected (error token is "./foo.sh-1")
$ zsh foo.sh 42
foo.sh:3: bad floating point constant

$0はスクリプトの名前なので、評価する算術式はまたはfoo.sh-1です./foo.sh-1。シェル間のさまざまなエラーメッセージを観察できます。私はAshのメッセージとbashのメッセージが最も明確ではないという事実に少し驚きました./。他のシェルのどれも問題が算術式にあることを言及していません。 Ashとpdkshはエラー行を報告するために停止します。

おすすめ記事