[bash] substitution optionnelle

Résolu
Bonjour,

j'ai dans un script bash c'est 2 lignes :

  nom_serveur=$(hostname)  
  nom_serveur=${nom_serveur//\./_}


quand le nom de serveur contient un ou plusieurs point, pas de soucis, les points sont changés en "_" par contre si le nom du serveur (hostname) ne contient pas de ".", j'ai droit à un :

Bad substitution

je pensais pourtant que le remplacement aurait lieu si et seulement si le "." était présent ... existe-il un moyen élégant de transformer la substitution en option ?

Merci pour votre aide !

Stéphane

3 réponses

Résumé de la discussion

Le problème porte sur une substitution Bash censée remplacer les points du nom d'hôte (hostname) par des underscores via nom_serveur=${nom_serveur//\./_}, et renvoie 'Bad substitution' si le nom ne contient pas de point. Plusieurs explications indiquent que le problème vient de la différence entre Bash et d'autres shells comme dash ou sh, et que la substitution étendue n'est pas supportée. Certaines explications soulignent qu'il faut invoquer explicitement Bash pour éviter l'erreur, et que l'usage dépend du shell actif, puisque sh peut renvoyer Bad substitution sur certains environnements. Des conseils portent sur la compatibilité et l'utilisation de méthodes portables du shell courant, et l'échange évoque également l'usage de $! et de la gestion des retours selon le contexte système.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,

    Pas chez moi

    ~ $ a=blabla
    ~ $ b="bla.bla"
    ~ $ echo $a
    blabla
    ~ $ echo $b
    bla.bla
    ~ $ echo ${b/\./_}
    bla_bla
    ~ $ echo ${a/\./_}
    blabla

    1. Modérateur
      Salut,

      Ni chez moi ;-((

      Quel bash ?
      Quel système ?
    2. Modérateur
      Re,

      Il y a aussi la possibilité que l'erreur est sur une autre ligne.
    3. médisant ya le numéro de ligne :)

      bash : GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
      systeme : ubuntu
      # cat /etc/*release*
      DISTRIB_ID=Ubuntu
      DISTRIB_RELEASE=8.04
      DISTRIB_CODENAME=hardy
      DISTRIB_DESCRIPTION="Ubuntu 8.04.4 LTS"

      Stéphane
  2. hello lami20j;

    pas mal ....

    j'ai ajouté un echo pour voir :

     63 nom_serveur=$(hostname)
     64 echo "nom du serveur : ${nom_serveur}\n";
     65 nom_serveur=${nom_serveur//\./_}
    


    et j'ai bien :

    nom du serveur : companysmtp3

    /superchemin/pleindesousrep/script_de_la_mort.sh: 65: Bad substitution

    ....

    comprend pas ...

    Stéphane
    1. Modérateur
      Et dans un terminal, que donne chez toi :

      [jp@MDK-2010 ~]$ nom_serveur=$(hostname)
      [jp@MDK-2010 ~]$ echo $nom_serveur
      MDK-2010
      [jp@MDK-2010 ~]$ nom_serveur=${nom_serveur//\./_}
      [jp@MDK-2010 ~]$ echo $nom_serveur
      MDK-2010
      [jp@MDK-2010 ~]$
    2. enorme ... pas d'erreur ....

      je comprend pas ...

      Stéphane
    3. Modérateur
      Du fait la médisance n'est pas si médisante que ça ;-))
    4. Modérateur
      Re,

      Et moi j'ai mis ça dans un script et pas d'erreur non plus.

      Essaie juste ça

      #!/bin/bash 
      nom_serveur=$(hostname) 
      echo "nom du serveur : ${nom_serveur}" 
      nom_serveur=${nom_serveur//\./_} 
      echo $nom_serveur
    5. Modérateur
      Re,

      Sinon utilise sed

      nom_serveur=$(hostname|sed 's/\./_/') 
      echo "nom du serveur : ${nom_serveur}" 
  3. par contre j'ai cette erreur maintenant :

    $!: unbound variable

    $! n'existe pas en /bin/bash ? pour récupérer l'erreur systeme ?

    Stéphane
    1. Modérateur
      Re,

      Oui elle existe mais ce n'est pas l'erreur qu'elle contient.
      Le code de retour c'est $?

      Variables spéciales  
      $$   PID du shell courant 
      $!   PID du dernier travail lancé en arrière plan 
      $?   code retour de la dernière commande 
    2. Modérateur
      Re,

      Signaler [PERL] bizarre retour de system
      Oui c'est moi mais c'était pour Perl pas pour shell ;-)))

      Alors là c'est à mon tour de rire ;-))))))
    3. Modérateur
      Re,

      Entre autre, on dit que si on commence en Perl il faut oublier le shell et vice-versa ;-)
    4. Modérateur
      Le thread en question il parlait de PERL et non de SHELL (bash ou autre) ;-((

      En shell, le $! renvoie le numéro de PID de la dernière commande lancée en arrière-plan.