IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Erreur : "indice inférieur hors d'intervalle" à l'exécution d'un shell


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 3
    Par défaut Erreur : "indice inférieur hors d'intervalle" à l'exécution d'un shell
    Bonjour,

    Voici mon problème :

    J'ai un shell toto.sh contenant uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/ksh
    TOTO[99999991]="Oui"
    export TOTO
    Quand je l'execute j'ai un comportement étrange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [user1@PF9SOSLN01 fonction]$ ./toto.sh
    ./toto.sh: ligne 2: TOTO: indice inférieur hors d intervalle
    [user1@PF9SOSLN01 fonction]$ echo ${TOTO[99999991]}
     
    [user1@PF9SOSLN01 fonction]$ . toto.sh
    [user1@PF9SOSLN01 fonction]$ echo ${TOTO[99999991]}
    Oui
    On peut voir ici que si je l'execute avec "./toto.sh" j'ai alors le message d'erreur : "indice inférieur hors d'intervalle"
    Ce message n'apparaît à première vue que l'orsque je dépasse un certain seuil de valeur... mais peu importe.
    On peut alors vérifier que le shell n'a pas été correctement executé et que la valeur du tableau n'est pas accessible (echo ${TOTO[99999991]} retourne vide).

    Ensuite, si j'execute ce même script avec ". toto.sh" je n'ai plus aucun message d'erreur et tout semble fonctionner pour le mieux.

    J'aimerais donc comprendre ce phénomène car mon objectif est d'executer ce script de manière absolue (./home/xxx/xxx/xxx/xxx/toto.sh) sans obtenir le message d'erreur en question.

    Merci pour votre aide

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par Goro Voir le message
    Bonjour,

    .sh" j'ai alors le message d'erreur : "indice inférieur hors d'intervalle"
    Ce message n'apparaît à première vue que l'orsque je dépasse un certain seuil de valeur... mais peu importe.
    bha si justement ca importe car les tableaux ont une limite de taille. bref c'est tout à fait normal.


    donc à l'execution ça pete

    quand tu fait [codeinline]. toto.sh[codeinline] ca execute pas vraiment ca "charge"
    en clair ta variable est exportée mais sans sa valuer (ou si elle en a une c'est juste a cause de tes tests precedents)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ . ./t.sh # lancement 
    $ echo $a
    5
    $ unset a 
    $ echo $a # pour s'assurer de vraiment plus avoir a charge a cause du test precedent
     
    $ sh ./t.sh # le lancement natif 
    $ echo $a
     
    $ rm t.sh
    dans un cas a est valorisé dans l'autre non...
    c'est normal.

    vaut voir en fonction de ton shell et de ton environnement.
    =====================================

    quel est ton besoin réellement de charger une valeur aussi grande que 9999991 ??

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 3
    Par défaut
    Aie...

    Bon, je vais voir comment je peux trouver une solution de contournement pour atteindre mon objectif.

    Merci pour l'explication.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Lorsque tu exécutes ton script, il est interprété par un ksh (voir le shebang).
    Lorsque tu le sources, il est interprété par le shell de ton terminal qui est probablement un bash.

    Or (dans hache ni esse), les limites entières de ces shells ne sont pas nécessairement les mêmes, ce qui peut expliquer la différence de comportement (indépendamment des problèmes de visibilité des variables).

    Généralement, si tu incrémentes le nombre 0 de 1 en 1, au bout d'un certain temps, tu tombes sur un nombre négatif (généralement le nombre opposé du précédent (à 1 près)). Si tu continues à incrémenter, le nombre négatif croît (donc sa valeur absolue diminue) jusqu'à repasser par 0, puis continuer de nouveau dans les positifs.

    J'ai écrit une petite fonction (fonctionnant de manière portable sous ksh, donc probablement sous bash) qui donne le max int du shell dans lequel elles est exécutée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function getMaxInt {
        typeset A=1 B C D
        while [[ "${A}" = *([0-9]) ]] ; do B=${A}; ((A=A*2)) ; done
        # B is the last "correct" value. Let's check the previous int:
        ((A-=1))
        if [[ "${A}" = *([0-9]) ]] ; then
            echo ${A}
            return 0
        fi
        # Let's dichotomy from B, adding D, then D/2, then D/4, etc. until 0
        D=${B}
        while [[ ${D} -gt 0 ]] ; do
            A=${B}
            while [[ "${A}" = *([0-9]) ]] ; do B=${A}; ((A+=D)) ; done
            ((D/=2))
        done
        echo ${B}
        return 0
    }
    à titre indicatif, voici quelques chiffres recueillis par ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    OS	vers distrib	KSH_VERSION	ksh_max_int	ksh93_max_int
    AIX	AIX 6.1	Version M-11/16/88f	9223372036854775807	8.9884656744e+307
    AIX	AIX 7.1	Version M-11/16/88f	9223372036854775807	
    linux	RHEL 5.3	@(#)PD KSH v5.2.14 99/07/13.2	9223372036854775807	NA
    linux	RHEL 5.4	@(#)PD KSH v5.2.14 99/07/13.2	9223372036854775807	
    linux	RHEL 5.5	@(#)PD KSH v5.2.14 99/07/13.2	9223372036854775807	
    linux	RHEL 5.5	@(#)PD KSH v5.2.14 99/07/13.2	9223372036854775807	
    linux	RHEL 6.2	@(#)MIRBSD KSH R39 2009/08/01	2147483647	1.18973149535719205e+4932

Discussions similaires

  1. [AC-2007] Erreur : L'indice n'appartient pas à la sélection
    Par Nayko dans le forum VBA Access
    Réponses: 5
    Dernier message: 04/04/2014, 11h23
  2. Erreur 'Indice ligne hors limites'
    Par gravey dans le forum Langage
    Réponses: 7
    Dernier message: 28/10/2009, 20h16
  3. Msg d'erreur: Erreur de traduction. Valeur hors des limites
    Par Zoilus dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/12/2005, 16h15
  4. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo