'Shifter' une variable

Résolu
Bonjour tout le monde,

Je fais mon premier script pour Unix.
J'ai compris la manipulation des variables $1...$9 ainsi que la fonction shift.
Est-il possible de les utiliser sur une variable quelconque ?

Je ne me trouve pas très clair, alors voici un exemple.
mesElements=$*

Et maintenant, comment je peux cibler le premier de mesElements et ensuite 'shifter' cette variable ?

Pour le moment, soit je refait un sous-programme pour réutiliser $1...$9, soit je fais des commandes avec
expr
. N'y a-t-il pas plus adapté ?
Et quel est le plus 'propre' pour l'Unix ?

Merci d'avance.
Matthia$

10 réponses

  1. Ouais, pas très simple pour les boucles infinies... ^^'

    Finalement, je ne m'en servirais pas de cette second idée.
    Mais en tout cas, merci pour le for, c'est finalement ce que je cherchais le plus.

    Bonne journée !
    1. Et si tu utilises une variable intermediaire ... ArgTmp

      If ( Verfi1 )
      then
      ArgTmp=Arg1
      elif ( Verif2)
      then
      ArgTmp=Arg2
      fi

      for i in $ArgTmp
      do
      echo $i
      done

      maintenant si tu as plus de n verif, je te conseille de passr au case :
      case valverif in
      verif1) ArgTmp=Arg1;;
      verif2) ArgTmp=Arg2;;
      verif3) ArgTmp=Arg3;;
      ...
      esac

      et la boucle.
      1. J'aimerais faire cohabiter Arg1 avec Verif1, et Arg2 avec Verif2.

        Si jamais Verif1 n'est pas bon, il me faut utiliser Arg1 pour corriger l'erreur.
        J'ai comme des couples ( Arg1, Verif1)
        1. Je ne suis pas sur de bien cerner ton probleme ...
          Si MesArguments="Arg1 Arg2" et MesVerif="Verif1 Verif2"
          la commande que je t'ai donne donnera :
          Arg1
          Arg2
          Verif1
          Verif2

          Peux-tu etre plus clair ?
          1. Non, dans mon cas, je voulais avoir $MesArguments et $MesVérifications, qui ont exactement la même taille (car l'une dépend de l'autre)

            Mais en fait, je n'utiliserais pas cette structure.
            Si tu as la réponse, ça peut toujours être intéressant. ;)

            En tous cas, merci bien.
            1. "i in" ne considere pas la variable mais plus la chaine d'element. Donc si j'ai deux liste MesArguments1 et MesArguments2

              for i in $MesArguments1 $MesArguments2
              do
              echo $i
              done

              donnera exactement le meme resultat !
              1. Coucou jipicy,

                En fait, je n'ai pas le droit d'utiliser le tableau (consignes du prof qui ne trouve prof)
                Merci quand même :)

                [Désolé pour le doublon, PC qui rame]
                1. Effectivement, c'est en ksh.

                  Ha, cette réponse me plait ! :)
                  Je n'avais pas pensé à utiliser for
                  Merci lecube

                  Par contre, si je veux travailler sur deux variables de même taille en même temps, je peux toujours utiliser une boucle for ?

                  Exemple
                  elts="elt1 elt2 elt3"
                  check="true false true"
                  On peut 'parcourir' les deux variables en même temps ?
                  1. Modérateur
                    Salut,

                    Tu peux utiliser les tableaux ou même les paramètres au-delà de $9 (il suffit pour cela de mettre des accolades).

                    Un exemple avec l'affichage d'un élément du tableau et du même élément avec les paramètres :

                    [tmpfs]$ cat foo.sh
                    #! /bin/sh
                    
                    #set -xv
                    
                    MesElements=( $* )
                    
                    echo "Elément 1 = ${MesElements[0]}"
                    
                    echo "Elément 1 = ${1}"
                    
                    echo "Elément 11 = ${MesElements[10]}"
                    
                    echo "Elément 11 = ${11}"
                    
                    echo "Elément 15 = ${MesElements[14]}"
                    
                    echo "Elément 15 = ${15}"
                    
                    [tmpfs]$ ./foo.sh a b c d e f g h i j k l m n o p q r s t u v w x y z
                    Elément 1 = a
                    Elément 1 = a
                    Elément 11 = k
                    Elément 11 = k
                    Elément 15 = o
                    Elément 15 = o
                    
                    [tmpfs]$

                    ;-))
                    1. Malheureusement, je n'ai pas le droit d'utiliser les tableaux.
                      Ce n'est pas un raisonnement très 'Unix', donc le prof n'en veut pas ^^'
                      Merci quand même
                  2. Bonjour,

                    Pourquoi ne pas utiliser une boucle ( en ksh) ? :

                    for i in $mesElements
                    do
                    echo $i
                    done

                    et ainsi on passe en revue tous les arguments ... Est-ce bien en ksh que vous voulez coder ?