4

オプションのパラメーターで指定されている場合、ループ内のカウンターをチェックして、最大値よりも大きいかどうかを判断しています。これはオプションなので、デフォルトで最大値を特別な値にするか、可能な最大の整数にすることができます。最初のオプションでは、反復ごとに追加のチェックが必要になるため、代わりに、 BourneShell操作で機能する最大整数を-gt調べたいと思います。

4

3 に答える 3

3

整数の制限は移植性がなく問題があるため、私は整数の制限を避けたいと思います

$ test 123412341234112341235 -gt 1 || echo bash compares ints
-bash: test: 123412341234112341235: integer expression expected
bash compares ints
$ env test 1 -gt 123412341234112341235 || echo coreutils compares strings
coreutils compares strings

代わりに、私はあなたが提案するように行い、次のような追加の比較を行います。

[ "$limit" ] && [ $count -gt $limit ]
于 2010-06-03T14:43:17.127 に答える
3

私のシステムでは、Bashの最大整数は、PerlPOSIXライブラリのLONG_MAX定数と同じように見えます。明らかに、これはプラットフォームやBashのコンパイル方法などによって異なります。しかし、これはテストの開始点として適しているようです。

declare -i max=$(perl -MPOSIX -le 'print LONG_MAX')

echo $max
9223372036854775807

echo "max+1 = " $(( i += 1 ))
max+1 =  -9223372036854775808

uname -a
Linux x200s 3.2.0-33-generic #52-Ubuntu SMP Thu Oct 18 16:29:15 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

更新:古い32ビットLinuxでこれを試した後、PerlのPOSIX LONG_MAXは2147483647であることがわかりましたが、Bashにはまだ同じ制限があります。/usr/include/limits.hで定義されているようで、__ WORDSIZEに依存しているようです。これは、32ビットシステムでも64ビットになる可能性があります。

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX     9223372036854775807L
#  else
#   define LONG_MAX     2147483647L
#  endif
于 2012-11-25T18:18:43.400 に答える
1

Bourneシェルには、数値を格納または操作する機能がありません。すべてが文字列として格納されます。この種のことについて質問している場合:

if [ $x -gt $y ]

次に、それは、と呼ばれる別の(Bourneシェル内の)実行可能ファイルによって処理されます。この実行可能ファイルtestには、'['と呼ばれるシンボリックリンクがあります。ですから、あなたの質問は、実際にはtestコマンドの制限についてです。私が見つけることができるすべてのドキュメントは、かなり控えめに見えます。

于 2010-06-03T12:28:28.367 に答える