6 votes

Que signifie SCRIPTNAME="${0##*/}" dans un script shell?

Ce code provient du script de démarrage du service apache2.

Qu'est-ce que cela signifie?

SCRIPTNAME="${0##*/}"

8voto

John Kugelman Points 108754

Il trouve le nom du script en cours d'exécution, en supprimant son répertoire. Par exemple, si le script est /etc/init.d/httpd, alors cela définirait SCRIPTNAME=httpd.

$0, ou ${0}, est le nom du script en cours d'exécution. L'opérateur ## est utilisé pour supprimer toute chaîne de caractères initiale qui correspond au motif */. * est un caractère générique donc */ signifie "toute chaîne de caractères suivie d'une barre oblique".

L'effet de ceci est de supprimer tous les noms de répertoires initiaux de $0, laissant juste le nom du script.

Depuis man bash:

${parameter#word}
${parameter##word}

Le mot est étendu pour produire un motif tout comme dans l'expansion des chemins d'accès. Si le motif correspond au début de la valeur du paramètre, alors le résultat de l'expansion est la valeur étendue du paramètre avec le motif correspondant le plus court supprimé (le cas "#") ou le motif correspondant le plus long supprimé (le cas "##"). Si le paramètre est @ ou *, l'opération de suppression du motif est appliquée à chaque paramètre de position tour à tour, et l'expansion est la liste résultante. Si le paramètre est une variable de tableau indexée avec @ ou *, l'opération de suppression du motif est appliquée à chaque membre du tableau tour à tour, et l'expansion est la liste résultante.

2voto

rodrigo Points 34500

Le côté gauche est facile: il attribue à la variable SCRIPTNAME. Le côté droit est plus compliqué:

  • $0 or ${0} est le nom utilisé pour invoquer le shell ou script actuel.
  • ${VAR##pattern} est la valeur de la variable $VAR avec la plus longue chaîne qui correspond au pattern supprimée depuis le début (utilisez un seul # pour le plus court ou %/%% pour supprimer la fin.

Ainsi, votre expression supprime le début du nom utilisé pour appeler le script jusqu'au dernier slash inclus.

En passant, c'est ce que le programme basename fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X