Quand %
est utilisé dans le modèle ${variable%substring}
il renverra le contenu de variable
avec l'occurrence la plus courte de substring
supprimé du dos de variable
.
Cette fonction prend en charge les modèles de caractères génériques - c'est pourquoi elle accepte l'étoile (astérisque) comme substitut pour zéro ou plusieurs caractères.
Il convient de mentionner que cela est spécifique à Bash - les autres shells Linux ne contiennent pas nécessairement cette fonction.
Si vous voulez en savoir plus sur la manipulation de chaînes dans Bash, je vous suggère fortement de lire cette page. Parmi d'autres fonctions pratiques, il - par exemple - explique ce que fait %%
faire :)
Edit :j'ai oublié de le mentionner lorsqu'il est utilisé dans le modèle $((variable%number))
ou $((variable1%$variable2))
le %
caractère fonctionnera comme opérateur modulo. DavidPostill a des liens de documentation plus spécifiques dans sa réponse.
Quand %
est utilisé dans un contexte différent, il doit être reconnu uniquement comme un caractère normal.
Manuel de référence de Bash :extension des paramètres du shell
${parameter%word}
${parameter%%word}
Le mot est développé pour produire un modèle comme dans l'expansion du nom de fichier. Si le modèle correspond à une partie finale de la valeur développée du paramètre , alors le résultat de l'expansion est la valeur du paramètre avec le motif correspondant le plus court (le
‘%’
cas) ou le plus long motif correspondant (le‘%%’
cas) supprimé. Si paramètre est‘@’
ou‘*’,
l'opération de suppression de modèle est appliquée à chaque paramètre positionnel tour à tour, et l'expansion est la liste résultante. Si paramètre est une variable tableau indicée par‘@’
ou‘*’,
l'opération de suppression de modèle est appliquée à chaque membre du tableau à tour de rôle, et l'expansion est la liste résultante.
En expérimentant, je trouve qu'une correspondance après % est rejetée, lorsque la chaîne est entourée d'accolades (accolades).
Pour illustrer :
touch abcd # Create file abcd
for file in ab*; do
echo $file # echoes the filename
echo $file% # echoes the filename plus "%"
echo ${file%} # echoes the filename
echo "${file%}" # echoes the filename
echo
echo "${file%c*}" # Discard anything after % matching c*
echo "${file%*}" # * is not greedy
echo ${file%c*} # Without quotes works too
echo "${file%c}" # No match after %, no effect
echo $file%c* # Without {} fails
done
Voici le résultat :
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*