2010-06-03 5 views
3

Je vérifie un compteur dans une boucle pour déterminer s'il est supérieur à un maximum, si spécifié dans un paramètre facultatif. Puisque c'est facultatif, je peux soit par défaut le maximum à une valeur spéciale ou à l'entier maximum possible. La première option nécessiterait une vérification supplémentaire à chaque itération, donc je voudrais plutôt savoir quel est l'entier maximum qui fonctionnera avec l'opération -gt Bourne Shell.Recherche de la valeur entière positive maximale dans Bourne Shell

Répondre

3

je rester à l'écart des limites entières car ils sont non portables et problématiques

$ 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 

Au lieu de cela, je voudrais juste faire comme vous le suggérez et faire la comparaison supplémentaire comme:

[ "$limit" ] && [ $count -gt $limit ] 
2

Le shell Bourne ne dispose d'aucun moyen pour stocker ou manipuler des nombres - tout est stocké sous forme de chaîne. Si vous demandez à ce genre de chose:

if [ $x -gt $y ] 

alors qui est gérée par un séparée (dans le shell Bourne) exécutable appelé test, qui a un lien symbolique appelé « [ ». Donc, votre question concerne vraiment les limites de la commande test, que tous les docs que je peux trouver semblent assez réticents.

2

Sur mon système, l'entier maximum de Bash semble être le même que la constante LONG_MAX de ma bibliothèque Perl POSIX. De toute évidence, cela varie sur votre plate-forme, et la façon dont votre Bash a été compilé, etc. Mais cela semble être un bon point de départ pour le tester:

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 

Mise à jour: Après avoir essayé cela sur un vieux 32 bits Linux, Je vois que POSIX LONG_MAX de mon Perl est 2147483647, mais que Bash a toujours la même limite. Il semble être défini dans /usr/include/limits.h, et dépend de votre __WORDSIZE, qui peut être de 64 bits, même sur des systèmes 32 bits:

/* Minimum and maximum values a `signed long int' can hold. */ 
# if __WORDSIZE == 64 
# define LONG_MAX  9223372036854775807L 
# else 
# define LONG_MAX  2147483647L 
# endif 
Questions connexes