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

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.

[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]

Bonjour,

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

$ 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

Avec un vrai shell :

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

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 )

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 ?

zsh :wink:
my turn :

#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" "$@"

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

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

[quote=“Totor”]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 :

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 :

Ç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).

[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

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 !

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

Salut,

Finalement j’ai opté pour awk.
J’ai compris, c’est vous dire comment c’est simple… :005
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… :wink:

Le principal étant que votre aide à été précieuse, et rapide. Merci beaucoup. :006

Sur ce, je vous laisse à vos effets de bord… :005

[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.

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 :

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

J’en été sûr.

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