2010-06-03 63 views
3

我在循環中檢查計數器以確定它是否大於某個最大值(如果在可選參數中指定)。由於它是可選的,我可以將最大值默認爲特殊值或最大可能的整數。第一個選項需要在每次迭代時進行額外的檢查,所以我想反過來找出Bourne Shell操作將與-gt一起使用的最大整數是多少。在Bourne Shell中查找最大正整數值

回答

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 ] 
2

Bourne shell沒有用於存儲或操作數字的設施 - 所有內容均以字符串形式存儲。如果你問這樣的事情:

if [ $x -gt $y ] 

然後由一個單獨的處理(在Bourne shell)中稱爲test可執行文件,有一個名爲「[」的符號鏈接。所以你的問題是關於test命令的限制,我可以找到的所有文檔似乎都很謹慎。

2

在我的系統中,Bash的最大整數似乎與我的Perl POSIX庫的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