これバッシュ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スクリプトなら、なぜ呼び出すのですか?明らかに、システムではsh
bashではなく、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はエラー行を報告するために停止します。
答え2
を使って実行してみてくださいbash foo.sh bar
。 bashスクリプトを作成するにはbashを使用する必要があります。上記で使用されている[[と]]は、Bourneシェルの派生物であるbashでのみ使用されます。 sh は Bourne SHell を意味し、bash と異なる場合があります。私はDebianがshにダッシュを使用していると思います。 Bash関連の機能を必要としない移植可能なBourneシェルスクリプトを書く方法を学ぶには、grepを使って次のものを書き換えることができます。
if echo "$foo" | grep '^[0-9][0-9]*$' >/dev/null 2>&1; then
echo "'$1' has a non-digit somewhere in it"
exit 1
else
echo "'$1' is strictly numeric"
fi
答え3
使用することをお勧めしますexpr
POSIX規格に準拠しているため:
if [ "$(expr "$1" : '^[0-9]\+$')" = "0" ]; then
echo "'$1' has a non-digit somewhere in it"
exit 1
else
echo "'$1' is strictly numeric"
fi