Cuando %
se usa en el patrón ${variable%substring}
devolverá el contenido de variable
con la ocurrencia más corta de substring
eliminado de la parte posterior de variable
.
Esta función admite patrones de comodines, por eso acepta estrellas (asterisco) como sustituto de cero o más caracteres.
Debe mencionarse que esto es específico de Bash:otros shells de Linux no necesariamente contienen esta función.
Si desea obtener más información sobre la manipulación de cadenas en Bash, le sugiero que lea esta página. Entre otras funciones útiles, por ejemplo, explica qué hace %%
hacer :)
Editar:olvidé mencionar que cuando se usa en el patrón $((variable%number))
o $((variable1%$variable2))
el %
El carácter funcionará como operador de módulo. DavidPostill tiene enlaces de documentación más específicos en su respuesta.
Cuando %
se usa en un contexto diferente, debe reconocerse solo como un carácter normal.
Manual de referencia de Bash:Expansión de parámetros de Shell
${parameter%word}
${parameter%%word}
La palabra se expande para producir un patrón como en la expansión de nombre de archivo. Si el patrón coincide con una porción final del valor expandido de parámetro , entonces el resultado de la expansión es el valor del parámetro con el patrón coincidente más corto (el ‘%’
caso) o el patrón coincidente más largo (el ‘%%’
caso) eliminado. Si parámetro es ‘@’
o ‘*’,
la operación de eliminación de patrón se aplica a cada parámetro posicional por turno, y la expansión es la lista resultante. Si parámetro es una variable de matriz subíndice con ‘@’
o ‘*’,
la operación de eliminación de patrón se aplica a cada miembro de la matriz por turnos, y la expansión es la lista resultante.
Experimentando, encuentro que una coincidencia después de % se descarta, cuando la cadena está encerrada entre corchetes (llaves).
Para ilustrar:
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
Aquí está la salida:
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*