Decalage des variables positionnelles

Résolu
Bonjour à tous ,

Je suis face à un problème tout bête que je n'arrive pas à résoudre.

Je voudrais que les paramètres de la méthode hello soient lus deux par deux.

hello(){
    while [ $# -gt 0 ];do
		
		SearchName "$1" "$2"
		
		cp toto.html tata.html
                echo "$#"
             shift 2 
done 
 
}


while test $# -ne 0; 
do
case "$1" in 
	
	-a) hello "$@"
esac
done


Lorsque j'exécute le code avec quartes arguments, j'obtiens $#=4 $#=2 $#=0 mais je ne sors jamais de la boucle

5 réponses

  1. salut,

    Il doit y avoir un shift pour la boucle while principale.

    Seuls les paramètres passés à la fonction sont décalés.

    Edit: il devrait n'y avoir de shift *que* dans la boucle principale.
    et passer seulement $1 et $2 à la fonction.
    0
    1. J'ai mis un shift dans la boucle while peut etre que tu parles de celle de case/esac
      Je ne comprends pas lorsque tu dis passer seulement $1 et $2 à la fonction"
      la fonction hello doit prendre 2 ,4 ou 6 arguments.
      0
      1. En fait, je ne vois pas vraiment d'intérêt à la boucle while principale (case n'initie pas une boucle). Peut-être un simple test suffirait.

        Il faudrait que tu nous en dises davantage sur ce que doit faire ton script.
        0
        1. En fait , je fais un case /esac pour appeler différentes méthodes.
          Ma méthode hello prend n arguments ; puis appelle la méthode SearchName qui a besoin de deux arguments $1 $2 et génère un fichier.

          Je voudrais pouvoir générer plusieurs fichiers en utilisant $1 et $2 , puis décaler les arguments pour recommencer .

          Plutot que un while ,il faut faire un if comme ca : ?
            if [ $# -ne 0 ];then
          		
          		SearchName "$1" "$2"
          		
          		cp toto.html tata.html
                          echo "$#"
                       shift 2 
          fi
           
          }
          
          0
          1. Ah , c'est bon j'ai trouvé pourquoi je bouclais en infini dans la boucle while .
            Il fallait mettre un $* derrière -a hello $@ ; shift $#;;

            hello(){
                while [ $# -gt 0 ];do
            		
            		SearchName "$1" "$2"
            		
            		cp toto.html tata.html
                           
                         shift 2 
            done 
             
            }
            
            
            while test $# -ne 0; 
            do
            case "$1" in 
            	
            	-a) hello  $@;shift $# ;;
            esac
            done
            
            0