Часть '${@/#/+}
' является расширением регулярного выражения:
${parameter/pattern/string}
Шаблон расширяется, чтобы создать шаблон так же, как в расширении имени файла.Параметр раскрывается, и самое длинное совпадение шаблона с его значением заменяется строкой.Если шаблон начинается с '/
', все совпадения шаблона заменяются строкой.Обычно заменяется только первый матч.Если шаблон начинается с '#
', он должен совпадать в начале расширенного значения параметра.Если шаблон начинается с '%
', он должен совпадать в конце расширенного значения параметра.Если строка пуста, совпадения шаблона удаляются, и / следующий шаблон может быть опущен.Если параметр '@
' или '*
', операция замещения применяется к каждому позиционному параметру по очереди, и расширение является результирующим списком.Если параметром является переменная массива, подписанная '@
' или '*
', операция замещения применяется к каждому члену массива по очереди, и расширение является результирующим списком.
Таким образом, похоже, что он заменяет пустую строку в начале каждого значения в списке аргументов '$@
' на '+
'.Его главное достоинство заключается в том, что он префикс каждого аргумента одним махом;в противном случае он похож на "+$var"
.
Часть '$(( ... ))
является арифметическим выражением.Он выполняет арифметику над выражением в скобках.Таким образом, в контексте он складывает значения в списке аргументов, предполагая, что они все числовые.Учитывая расширение, оно может дать:
set -- 2 3 5 7 11
sample=$((${@/#/+}))
sample1=$((+2 +3 +5 +7 +11))
echo $sample = $sample1
и, следовательно, '28 = 28
'.