В оболочке Linux, что делает%, как в:
for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done
 Когда % используется в шаблоне ${variable%substring} он вернет содержимое variable с кратчайшим вхождением substring удаленной из задней части variable .
Эта функция поддерживает шаблоны подстановочных знаков - поэтому она принимает звездочку (звездочку) в качестве замены для нуля или более символов.
Следует отметить, что это специфично для Bash - другие оболочки Linux не обязательно содержат эту функцию.
Если вы хотите узнать больше о работе со строками в Bash, я настоятельно рекомендую прочитать эту страницу. Среди других полезных функций это, например, объясняет, что делает %% :)
Редактировать: я забыл упомянуть, что когда он используется в шаблоне $((variable%number)) или $((variable1%$variable2)) символ % будет функционировать как оператор по модулю. DavidPostill имеет более конкретные ссылки на документацию в своем ответе. 
Когда % используется в другом контексте, он должен распознаваться только как обычный символ.
Справочное руководство Bash: Расширение параметров оболочки
${parameter%word}${parameter%%word}Слово раскрывается для создания шаблона, как в расширении имени файла. Если шаблон соответствует завершающей части расширенного значения параметра, то результатом расширения является значение параметра с самым коротким совпадающим шаблоном (случай
‘%’) или самым длинным совпадающим шаблоном (случай‘%%’) удален. Если параметром является‘@’или‘*’,операция удаления шаблона применяется по очереди к каждому позиционному параметру, и расширение является результирующим списком. Если параметром является переменная массива, подписанная с помощью‘@’или‘*’,операция удаления шаблона применяется по очереди к каждому члену массива, и расширение является результирующим списком.
Экспериментируя, я обнаружил, что совпадение после% отбрасывается, когда строка заключена в фигурные скобки (фигурные скобки).
Проиллюстрировать:
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
Вот вывод:
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*
bash), что делает % ?for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done
В этом конкретном случае % является оператором сопоставления с образцом (обратите внимание, что он также может быть оператором по модулю ).
$ {var% $ Pattern}, $ {var %% $ Pattern}
${var%$Pattern}Удалите из$varсамую короткую часть$Pattern, соответствующую внутреннему концу$var.
${var%%$Pattern}Удалите из$varсамую длинную часть$Pattern, соответствующую внутреннему концу$var.Пример: сопоставление с образцом при подстановке параметров
#!/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
Подстановка исходного параметра
%по модулю или mod (возвращает остаток от операции целочисленного деления)
bash$ expr 5 % 3 25/3 = 1, с остатком 2
Операторы источника