'Shifter' une variable

Résolu/Fermé
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 - 23 déc. 2009 à 18:24
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 - 24 déc. 2009 à 12:02
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

lecube Messages postés 304 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010 54
23 déc. 2009 à 18:29
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 ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
23 déc. 2009 à 18:37
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]$

;-))
0
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 78
23 déc. 2009 à 18:40
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
0
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 78
23 déc. 2009 à 18:37
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 ?
0
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 78
23 déc. 2009 à 18:39
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]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lecube Messages postés 304 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010 54
23 déc. 2009 à 19:01
"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 !
0
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 78
23 déc. 2009 à 19:10
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.
0
lecube Messages postés 304 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010 54
23 déc. 2009 à 19:14
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 ?
0
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 78
23 déc. 2009 à 19:20
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)
0
lecube Messages postés 304 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010 54
23 déc. 2009 à 19:25
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.
0
Matthia$ Messages postés 364 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 17 mars 2010 78
24 déc. 2009 à 12:02
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 !
0