Quando %
è usato nel pattern ${variable%substring}
restituirà il contenuto di variable
con la ricorrenza più breve di substring
cancellato dal retro di variable
.
Questa funzione supporta i modelli di caratteri jolly:ecco perché accetta la stella (asterisco) come sostituto di zero o più caratteri.
Va detto che questo è specifico di Bash - altre shell Linux non contengono necessariamente questa funzione.
Se vuoi saperne di più sulla manipolazione delle stringhe in Bash, ti consiglio vivamente di leggere questa pagina. Tra le altre utili funzioni, ad esempio, spiega cosa significa %%
fare :)
Modifica:ho dimenticato di dirlo quando è usato nel modello $((variable%number))
o $((variable1%$variable2))
il %
carattere funzionerà come operatore modulo. DavidPostill ha collegamenti alla documentazione più specifici nella sua risposta.
Quando %
viene utilizzato in contesti diversi, dovrebbe essere riconosciuto solo come carattere normale.
Manuale di riferimento di Bash:espansione dei parametri della shell
${parameter%word}
${parameter%%word}
La parola viene espanso per produrre un modello proprio come nell'espansione del nome file. Se il modello corrisponde a una parte finale del valore espanso di parametro , allora il risultato dell'espansione è il valore di parametro con il modello di corrispondenza più breve (il
‘%’
caso) o il modello di corrispondenza più lungo (il‘%%’
caso) cancellato. Se parametro è‘@’
o‘*’,
l'operazione di rimozione del modello viene applicata a turno a ciascun parametro posizionale e l'espansione è l'elenco risultante. Se parametro è una variabile array con indice‘@’
o‘*’,
l'operazione di rimozione del modello viene applicata a turno a ciascun membro dell'array e l'espansione è l'elenco risultante.
Sperimentando, scopro che una corrispondenza dopo % viene scartata, quando la stringa è racchiusa tra parentesi graffe (parentesi graffe).
Per illustrare:
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
Ecco l'output:
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*