web-dev-qa-db-fra.com

Que fait% dans les chaînes du shell Linux?

Dans Linux Shell, que fait%, comme dans:

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done
26
Nissim Kaufmann

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.

28
Marek Rost

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.

9
Steven

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*
7
Nissim Kaufmann

Dans Linux Shell (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).


Opérateur de correspondance de modèle

$ {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


Opérateur Modulo

%

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

7
DavidPostill