Wenn %
wird in Muster ${variable%substring}
verwendet es gibt den Inhalt von variable
zurück mit dem kürzesten Vorkommen von substring
gelöscht von der Rückseite von variable
.
Diese Funktion unterstützt Platzhaltermuster - deshalb akzeptiert sie Sterne (Sternchen) als Ersatz für null oder mehr Zeichen.
Es sollte erwähnt werden, dass dies Bash-spezifisch ist - andere Linux-Shells enthalten diese Funktion nicht unbedingt.
Wenn Sie mehr über die String-Manipulation in Bash erfahren möchten, empfehle ich Ihnen dringend, diese Seite zu lesen. Neben anderen praktischen Funktionen erklärt es zum Beispiel, was %%
macht tun :)
Bearbeiten:Ich habe vergessen, das zu erwähnen, wenn es in Muster $((variable%number))
verwendet wird oder $((variable1%$variable2))
die %
Zeichen fungiert als Modulo-Operator. DavidPostill enthält in seiner Antwort spezifischere Dokumentationslinks.
Wenn %
in einem anderen Kontext verwendet wird, sollte es nur als reguläres Zeichen erkannt werden.
Bash-Referenzhandbuch:Shell-Parametererweiterung
${parameter%word}
${parameter%%word}
Das Wort wird erweitert, um ein Muster zu erzeugen, genau wie bei der Dateinamenerweiterung. Wenn das Muster mit einem abschließenden Teil des erweiterten Werts von Parameter übereinstimmt , dann ist das Ergebnis der Erweiterung der Wert von parameter mit dem kürzesten übereinstimmenden Muster (der ‘%’
Fall) oder das längste übereinstimmende Muster (der ‘%%’
Fall) gelöscht. Wenn Parameter ist ‘@’
oder ‘*’,
die Musterentfernungsoperation wird der Reihe nach auf jeden Positionsparameter angewendet, und die Erweiterung ist die resultierende Liste. Wenn Parameter ist eine mit ‘@’
subskribierte Array-Variable oder ‘*’,
Die Musterentfernungsoperation wird der Reihe nach auf jedes Mitglied des Arrays angewendet, und die Erweiterung ist die resultierende Liste.
Durch Experimentieren finde ich heraus, dass eine Übereinstimmung nach % verworfen wird, wenn die Zeichenfolge in geschweiften Klammern (geschweifte Klammern) eingeschlossen ist.
Zur Veranschaulichung:
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
Hier ist die Ausgabe:
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*