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