Que fait $ {0% / *} dans les scripts shell?


17

Désolé si c'est une question stupide, mais j'ai cherché sans succès.

Que fait exactement la deuxième ligne?:

#!/bin/sh
cd ${0%/*} || exit 1

Je sais que le premier est le shebang, le second essaie de changer de répertoire mais la partie déroutante l'est ${0%/*}.

Pouvez-vous m'expliquer cette deuxième ligne?


2
Comme expliqué par Andrea dans une réponse, $ {0% / *} se traduit par le chemin du répertoire préfixé au nom du script lors de son appel. Une alternative consiste à utiliser la dirnamecommande $(dirname $0)
intégrée

@alwayslearning: Quelle version de shell et de shell utilisez-vous qui dirnameest intégrée? Ce n'est certainement pas dans Bash v4.3.11 qui est le shell par défaut dans Ubuntu Trusty.
David Foerster

Mes excuses pour la confusion, juste vérifié que ce dirnamen'est pas un shell intégré.
apprentissage le

Réponses:


27

${0}est le premier argument du script, c'est-à-dire le nom ou le chemin du script. Si vous lancez votre script path/to/script.sh, puis ${0}sera exactement cette chaîne: path/to/script.sh.

La %/*pièce modifie la valeur de ${0}. Cela signifie: prendre tous les caractères jusqu'à ce qu'ils soient /suivis d'un nom de fichier. Dans l'exemple ci-dessus, ${0%/*}sera path/to.

Vous pouvez le voir en action sur votre shell:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh prend en charge de nombreux autres types de «substitution de paramètres». Voici, par exemple, comment prendre le nom de fichier au lieu du chemin:

$ echo "${x##*/}"
script.sh

En général, %et %%supprimer les suffixes, tandis que #et ##supprimer les préfixes. Vous pouvez en savoir plus sur la substitution de paramètres .


2
Cette "|| sortie 1" semble inutile: si ce n'est plus possible de changer dir $? est égal à 1.
Josef Klimuk

2
Ce serait bien de mentionner que la construction est documentée comme "Supprimer le modèle de préfixe / suffixe correspondant" dans le manuel. Également une bonne façon de se rappeler ce qui est qui est que # est le décalage 3 (à gauche de $),% est le décalage 5 (à droite de $), au moins sur le clavier américain.
chexum

1
@JosefKlimuk: le || exit 1 peut être nécessaire car cdpeut se terminer avec le statut 2, et non 1, en cas d'erreur. Cependant, je conviens que ce n'est pas très utile (généralement, les programmes ne se soucient pas des statuts de sortie spécifiques). Cela fait probablement partie d'un script plus large?
Andrea Corbellini

1
@AndreaCorbellini Sûrement raison. À peu près, la seule façon dont il peut être utile est de faire partie d'un script plus large. Un script qui ne fait que changer le répertoire courant n'a aucun effet, car il n'affecte que le shell exécutant ce script. Le processus parent ne le voit jamais.
hvd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.