Substitution et parametres positionnes

Résolu
'Lex Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai:

#!/bin/zsh

for i in (seq $#);
do
  echo "${$i+3}"
done


Je voudrais que echo "${$i+3}" affiche la valeur du paraître positionnel (le paramètre $4 si i=1)
et cette solution ne fonctionne pas.

des idées?

3 réponses

  1. Utilisateur anonyme
     
    salut,

    avec zsh:
    set -- a b c d
    for ((i=1;i<=$#;i+=3)); do echo ${(P)i}; done

    avec bash:
    set -- a b c d
    for ((i=1;i<=$#;i+=3)); do echo ${!i}; done
    1
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Voici comment tu peux faire :

    !/bin/bash
    
    index=$(expr 1 + 2)
    cmd="echo \$$index"
    echo $cmd
    eval $cmd


    À l'exécution :

    (mando@velvet) (~) $ sh toto.sh aa bb ccc
    echo $3
    ccc

    Bonne chance
    0
    1. Utilisateur anonyme
       
      salut,

      'expr' n'est pas utile dans le contexte d'un interpréteur autre que csh.
      l'emploi d''eval' est périlleux, il est préférable de ne pas l'utiliser avant d'être aguerri, et de savoir exactement ce que cela fait.
      pourquoi un hashbang bash, si c'est pour appeler le script avec 'sh' ?
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      'expr' n'est pas utile dans le contexte d'un interpréteur autre que csh.

      Sauf que là l'énoncé indiquait qu'il fallait faire une addition. Il faut à un moment écrire cette addition avec un opérateur. Donc expr ou un opérateur bash spécifique pourquoi pas, mais en tout cas on ne peut pas écrire d'addition directement. D'où mon "expr".

      pourquoi un hashbang bash, si c'est pour appeler le script avec 'sh' ?

      Sous debian :

      lrwxrwxrwx 1 root root 4 janv. 10 11:14 /bin/sh -> dash

      ... qui est un bash allégé. J'admets que ce n'est pas forcément le cas de tous les linux, mais généralement sh n'est bien souvent qu'un bash ou un bash-like. Donc j'ai raccourci mais en toute rigueur il aurait fallu écrire
      bash toto.sh
      . Maintenant très honnêtement je pense que si tu t'attaches à cette ligne, c'est que tu ne focalises pas sur la partie "importante" de la réponse. Le seul intérêt de cette ligne c'était indiquer les paramètres que j'avais passé.

      Ensuite pourquoi bash et pas sh. L'opérateur $(...) n'est pas supporté par tous les shells et que le forum CCM altère les backquotes (et ce qui est triste c'est que ça fait des années que j'ai remonté ce bug), sinon c'est ce que j'aurais utilisé, et pour le coup j'aurais vraiment mis "sh" partout.

      Maintenant je concède que la réponse que tu proposes pour zsh et bash est syntaxiquement plus élégante.
      https://forums.commentcamarche.net/forum/affich-29982343-substitution-et-parametres-positionnes#3
      0
    3. Utilisateur anonyme
       
      on ne peut pas écrire d'addition directement
      en bash (au moins), on peut :
      $ declare -i somme
      $ somme="12 + 24"
      $ echo $somme
      36
      sinon, un shell POSIX (ash dash bash ksh zsh) effectue des évaluations arithmétiques :
      $ echo $((12 + 24))
      36
      eventuellement, bash possède une commande
      let
      :
      let somme=12+24
      echo $somme
      36

      en toute rigueur, il faut rendre le script exécutable, et laisser le noyau utiliser le shell indiqué par le hashbang.

      enfin, j'ai donné ma réponse, le commentaire t'était adressé.
      0
    4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      Ok merci pour ces précisions
      0
  3. 'Lex Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
     
    @mamiemando; merci. ça colle.

    quelqu'un aurai des renseignements sur l'option n de read? (read -n ...) je ne parvient pas a la faire fonctionner.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Extrait du
      man bash
      :

       -n nb_car
      read s'arrête après avoir lu nb_car caractères plutôt que d'attendre une ligne complète en entrée, mais un délimiteur est respecté si moins de nb_car caractères ont été lus avant le délimiteur.

      $ read -n 3 -p "Entrez 5 lettres : "
      Entrez 5 lettres : mam
      $ echo ${REPLY}
      mam

      Seule 3 lettres ont pu être tapées dans le terminal.
      0
    2. 'Lex Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
       
      ça ne fonctionne pas en zsh
      et j'ai besoin de zsh pour mettre un grand nombre de paramètres aux commandes.
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Faut pas avoir la flemme de chercher des fois ;-((

      Extrait :

      -k [ num ]
      Read only one (or num) characters from the terminal.
      0
    4. 'Lex Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
       
      Merci. je ne la trouvai pas.
      0