Dans Linux Shell, que fait%, comme dans:
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
Lorsque %
est utilisé dans le modèle ${variable%substring}
, il renvoie le contenu de variable
avec la plus courte occurrence de substring
supprimé de l'arrière de variable
.
Cette fonction prend en charge les modèles génériques - c’est pourquoi elle accepte star (astérisque) comme substitut pour zéro caractère ou plus.
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 des chaînes dans Bash, je vous suggère fortement de lire cette page . Parmi d'autres fonctions pratiques, il explique, par exemple, ce que %%
fait :)
Edit: j’ai oublié de mentionner que, lorsqu’il est utilisé dans le motif $((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.
Lorsque %
est utilisé dans un contexte différent, il doit être reconnu comme caractère normal uniquement.
Manuel de référence Bash: Expansion des paramètres du shell
${parameter%Word}
${parameter%%Word}
Le mot est développé pour produire un motif exactement comme dans l'extension de nom de fichier. Si le motif correspond à une partie finale de la valeur étendue du paramètre , le résultat de l'expansion est la valeur du paramètre avec le modèle correspondant le plus court (le cas
‘%’
) ou le modèle le plus long correspondant (le cas‘%%’
) est supprimé. Si paramètre est‘@’
ou‘*’,
, l'opération de suppression de modèle est appliquée à chaque paramètre de position et l'extension est la liste résultante. Si paramètre est une variable de tableau indexée avec‘@’
ou‘*’,
, l'opération de suppression de modèle est appliquée à chaque membre du tableau à son tour, et l'extension est la liste résultante.
En expérimentant, je trouve qu'une correspondance après% est ignorée, lorsque la chaîne est placée entre 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 la sortie:
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*
bash
), que fait %
?for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
Dans ce cas particulier, le %
est opérateur de correspondance de motif (remarque: il peut également s'agir d'un modulo opérateur).
$ {var% $ Pattern}, $ {var %% $ Pattern}
${var%$Pattern}
Supprime de$var
la partie la plus courte de$Pattern
qui correspond à la fin de$var
.
${var%%$Pattern}
Supprime de$var
la partie la plus longue de$Pattern
qui correspond à l'extrémité arrière de$var
.Exemple: correspondance de modèle dans la substitution de paramètre
#!/bin/bash # patt-matching.sh # Pattern matching using the # ## % %% parameter substitution operators. var1=abcd12345abc6789 pattern1=a*c # * (wild card) matches everything between a - c. echo echo "var1 = $var1" # abcd12345abc6789 echo "var1 = ${var1}" # abcd12345abc6789 # (alternate form) echo "Number of characters in ${var1} = ${#var1}" echo echo "pattern1 = $pattern1" # a*c (everything between 'a' and 'c') echo "--------------" echo '${var1#$pattern1} =' "${var1#$pattern1}" # d12345abc6789 # Shortest possible match, strips out first 3 characters abcd12345abc6789 # ^^^^^ |-| echo '${var1##$pattern1} =' "${var1##$pattern1}" # 6789 # Longest possible match, strips out first 12 characters abcd12345abc6789 # ^^^^^ |----------| echo; echo; echo pattern2=b*9 # everything between 'b' and '9' echo "var1 = $var1" # Still abcd12345abc6789 echo echo "pattern2 = $pattern2" echo "--------------" echo '${var1%pattern2} =' "${var1%$pattern2}" # abcd12345a # Shortest possible match, strips out last 6 characters abcd12345abc6789 # ^^^^ |----| echo '${var1%%pattern2} =' "${var1%%$pattern2}" # a # Longest possible match, strips out last 12 characters abcd12345abc6789 # ^^^^ |-------------| # Remember, # and ## work from the left end (beginning) of string, # % and %% work from the right end. echo exit 0
Source Paramètre Substitution
%
modulo ou mod (renvoie le reste d'une opération de division entière)
bash$ expr 5 % 3 2
5/3 = 1, avec le reste 2
Source Opérateurs