[bash] substitution optionnelle

Résolu/Fermé
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 - 8 sept. 2010 à 14:49
dubcek Messages postés 18753 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 7 novembre 2024 - 9 sept. 2010 à 08:39
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

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
8 sept. 2010 à 14:57
Salut,

Pas chez moi


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

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 897
8 sept. 2010 à 14:58
Salut,

Ni chez moi ;-((

Quel bash ?
Quel système ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
8 sept. 2010 à 14:59
Re,

Il y a aussi la possibilité que l'erreur est sur une autre ligne.
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
8 sept. 2010 à 15:05
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
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
8 sept. 2010 à 15:01
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
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 897
8 sept. 2010 à 15:07
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 ~]$
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
8 sept. 2010 à 15:10
enorme ... pas d'erreur ....

je comprend pas ...

Stéphane
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 897
8 sept. 2010 à 15:12
Du fait la médisance n'est pas si médisante que ça ;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 8/09/2010 à 15:13
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
8 sept. 2010 à 15:14
Re,

Sinon utilise sed


nom_serveur=$(hostname|sed 's/\./_/') 
echo "nom du serveur : ${nom_serveur}" 
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
8 sept. 2010 à 15:19
par contre j'ai cette erreur maintenant :

$!: unbound variable

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

Stéphane
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
8 sept. 2010 à 15:21
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 
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
Modifié par sbouli le 8/09/2010 à 15:28
oui, je me base bien sur le $? pour le code retour mais on m'avais indiqué $! pour obtenir des infos complémentaires en cas d'erreur au niveau du systeme. dans ce thread : https://forums.commentcamarche.net/forum/affich-18962490-perl-bizarre-retour-de-system#p18975703

mort de rire, c'est toi qui me l'a appris : "Salut,
Mets aussi $! dans ton die, pour voir l'erreur système "

Stéphane
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 8/09/2010 à 15:30
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 ;-))))))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
8 sept. 2010 à 15:31
Re,

Entre autre, on dit que si on commence en Perl il faut oublier le shell et vice-versa ;-)
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 897
8 sept. 2010 à 15:31
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.
0