'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. 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 ?
    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. 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. 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. "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. 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. 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. 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. 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. 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 !