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*