# Extraire une partie du nom du script et l'utiliser comme var

**URL:** <https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833 "2016-02-21T03:51:27Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/1 "2016-02-21T03:51:28Z")

</div>

Salut,

J’aimerais - est-possible ? - que certaines parties du nom d’un script bash (lancé dans un shell ou une tâche cron) soient utilisée en variable dans ce même script…

J’ai un script qui s’appelle par exemple: backup\_0\_web01.sh  
J’aimerais, quand je lance ce script, que 0 et web01 soient utilisés comme variables à l’intérieur de ce même script…

Merci.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/2 "2016-02-21T03:51:28Z")

</div>

[code]  
#!/bin/sh

v=$(echo $0 | sed -e ‘s/^._([^]_).sh$/\1/’)  
nb=$(echo $0 | sed -e ‘s/^._([^]_)_[^_]\*$/\1/’)

echo "nb = $nb"  
echo “v = $v”[/code]  
$0 c’est le nom du script, il faut le découper.

Avec awk ça pourrait être ça :

[code]  
#!/bin/sh

v=$(echo ${0%.sh} | awk -F\_ ‘{print $3}’)  
nb=$(echo ${0%.sh} | awk -F\_ ‘{print $2}’)

echo "nb = $nb"  
echo “v = $v”[/code]

---

<div class="post-metadata">

**Author:** ![LeDub](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/85f322/32.png) [@LeDub](https://www.debian-fr.org/u/LeDub)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/3 "2016-02-21T03:51:28Z")

</div>

Bonjour,

En deux étapes, pour supprimer le premier champ, c’est-à-dire backup\_, tu peux faire cela :

```auto
$ SCRIPT=backup_0_web01.sh
$ SCRIPT=${SCRIPT#*_}
$ echo $SCRIPT
0_web01.sh

$ SCRIPT=${SCRIPT%\.*}
$ echo $SCRIPT
0_web01
[/code]Ça c'est pour n'avoir qu'une seule variable, si tu souhaites en avoir au moins deux, tu devrais faire cela :
[code]$
$ VAR1=$(echo backup_0_web01.sh| awk -F'_' '{print $2}')
$ VAR2=$(echo backup_0_web01.sh| awk -F'_' '{print $3}')
$ echo $VAR1
0
$ echo $VAR2
web01.sh
```

LeDub qui aime bien le awk

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/4 "2016-02-21T03:51:28Z")

</div>

Avec un vrai shell :

`part1=${${(s:_:)0}[2]}
part2=${${(s:_:)0%.sh}[3]}`

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/5 "2016-02-21T03:51:28Z")

</div>

Salut,  
C’est vraiment cool de vous avoir…  
Merci beaucoup, vous m’avez fait gagner des heures de recherches (j’avais commencé, mais au bout d’une trentaine de sites et forums… ![:017](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit") )

J’ai opté pour la solution de MisterFreeze avec sed. 1er essai concluant.  
C’est génial de pouvoir utiliser le nom du script lui-même comme variable!

Mais j’ai l’impression qu’avec awk je pourrais plus facilement comprendre et adapter la découpe du nom de fichier. Je vais faire des essais.

@LeDub  
Si je met le nom du script dans le script, ça n’a plus d’intérêt ? Enfin je n’ai pas compris ta suggestion, désolé… (je suis plus que limité dans ce domaine…)

Edit: @MisterFreeze: Un vrai shell ?

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/6 "2016-02-21T03:51:28Z")

</div>

zsh 😉  
my turn :

```auto
#methode 1
IFS='_.' read a b c d <<< ${0##*/}
printf "%s\n" $a $b $c $d
#methode 2
IFS='_.' tab=( ${0##*/} )
printf "%s\n" "${tab[@]}"
#methode 3
IFS='_.' set -- ${0##*/}
printf "%s\n" "$@"
```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/7 "2016-02-21T03:51:29Z")

</div>

Ta méthode 3 à a un gros effet de bord en redéfinissant la variable $@ (et les $1, $2, etc je crois).

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/8 "2016-02-21T03:51:29Z")

</div>

quel effet de bord ?  
il faut juste savoir qu’en redéfinissant les paramétres positionnels, ça écrase ceux déjà en place.

edit : aurais-tu testé directement en console (ce que je n’ai jamais fait) ? Auquel cas effectivement, il est possible qu’il y a en ait

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/9 "2016-02-21T03:51:31Z")

</div>

[quote=«&nbsp;Totor&nbsp;»]quel effet de bord ?  
il faut juste savoir qu’en redéfinissant les paramètres positionnels, ça écrase ceux déjà en place.[/quote]  
C’est la définition même d’un effet de bord. Par exemple sur wikipedia :

> [@](#):
>
> En informatique, une fonction est dite à effet de bord si elle modifie un état autre que sa valeur de retour.

Là en l’occurrence il est important dans le sens où la probabilité que les paramètres positionnels soient utilisés pour autre chose n’est pas nul. C’est un peu comme en Perl :

```auto
$var =~ /\(.*\)_\(.*\)/
```

Ça modifie ou crée 2 variables $1 et $2. Le désavantage est limité par le fait que ce genre de variables sont utilisée de manière locale.

Mais d’une manière général, c’est bien d’éviter les effets de bord (ça diminue le couplage et simplifie la maintenance).

---

<div class="post-metadata">

**Author:** ![LeDub](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/85f322/32.png) [@LeDub](https://www.debian-fr.org/u/LeDub)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/10 "2016-02-21T03:51:31Z")

</div>

[quote=“lol”]@LeDub  
Si je met le nom du script dans le script, ça n’a plus d’intérêt ? Enfin je n’ai pas compris ta suggestion, désolé… (je suis plus que limité dans ce domaine…)[/quote]  
Désolé de ne pas avoir préciser ces deux lignes que je mentionne dans tous mes scripts

```auto
SCRIPT_AVEC_EXT=$(basename $0) # Récupération du nom du script exécuté
SCRIPT_SANS_EXT=${SCRIPT_AVEC_EXT%%\.*} # Suppression de l'extension du script
```

Ces deux lignes me permettent d’avoir un nom de fichier de traces, de configuration ou temporaires ou encore un sujet d’un message qui facilitent grandement le script d’origine.

LeDub qui préfère le script à la paperasserie !

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/11 "2016-02-21T03:51:31Z")

</div>

@MisterFreez : sauf que là, c’est le propre de l’instruction set 😉

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/12 "2016-02-21T03:51:33Z")

</div>

Salut,

Finalement j’ai opté pour awk.  
J’ai compris, c’est vous dire comment c’est simple… ![:005](https://www.debian-fr.org/uploads/default/original/1X/cdd45e7dd754015ac5291329b843a2851a0d4fe8.gif "chaud")  
j’avoue que la série d’expressions de sed me laisse perplexe.

Merci à LeDub pour la précision.  
J’ai compris (après coup) que tu étais en console et non dans un script.

lol, qui comme LeDub aime awk… 😉

Le principal étant que votre aide à été précieuse, et rapide. Merci beaucoup. ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

Sur ce, je vous laisse à vos effets de bord… ![:005](https://www.debian-fr.org/uploads/default/original/1X/cdd45e7dd754015ac5291329b843a2851a0d4fe8.gif "chaud")

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/13 "2016-02-21T03:51:34Z")

</div>

[quote=“MisterFreez”]Avec un vrai shell :

`part1=${${(s:_:)0}[2]}
part2=${${(s:_:)0%.sh}[3]}`[/quote]  
Bonjour MisterFreez

tu peux m’expliquer ce truc là?  
Ca fonctionne avec bash? j’ai essayé dans un script dash ou bash et il y a un problème.  
Il a un truc que je ne dois pas conaître.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/14 "2016-02-21T03:51:38Z")

</div>

Par vrai shell j’entendais zsh.

Zsh utilise des “modifieurs” (je connais pas la dénomination officielle) entre parenthèses pour manipuler les variables directement.  
Dans l’exemple je découpe la chaine avec cette syntaxe ${(s:N:)var} avec var la variable et N le où les caractères de découpent. Il en résulte un tableau.

On récupère l’élément que l’on veut avec la syntaxe ${var2[i]} avec var2 un tableau et i l’indice entre 1 et la taille du tableau.

Dernière chose intéressante en zsh, c’est que l’on peut séquencer ces actions ce qui donne ici :

```auto

```

Pour l’autre exemple c’est juste un %.sh qui va retirer le suffixe .sh à la variable avant la découpe.

Avec ces modifieurs on peut vraiment faire énormément de choses, le split, le join, un filtre, une substitution à la sed, des tris (dans un sens ou l’autre avec ou sans respect de la casse), etc. En général on peut avec ça éviter la majorité des appelles à sed et grep (on créer un tableau puis on travaille dessus) et probablement à awk.

Un exemple de script où je me suis amusé à vraiment utiliser zsh comme il faut c’est apt-search :  
[https://www.debian-fr.org/yapyt-faciliter-l-installation-de-paquets-t35034.html#p355323](https://www.debian-fr.org/yapyt-faciliter-l-installation-de-paquets-t35034.html#p355323)

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 3:51 UTC](https://www.debian-fr.org/t/extraire-une-partie-du-nom-du-script-et-lutiliser-comme-var/34833/15 "2016-02-21T03:51:46Z")

</div>

> [@MisterFreez](#):
>
> Par vrai shell j’entendais zsh.

J’en été sûr.

Pas trop le temps maintenant mais je regarderai à nouveau en suivant tes explications  
merci.
