Вы можете использовать функции bash в командах / конвейерах, как если бы вы использовали обычные программы. Функции также доступны для подоболочек и транзитивно, Подстановка команд:
VAR=$(scan)
Это простой способ достичь желаемого результата в большинстве случаев. Ниже я опишу особые случаи.
Сохранение трейлинга Новые строки:
Одним из (обычно полезных) побочных эффектов подстановки команд является то, что она удалит любое количество завершающих строк новой строки. Если вы хотите сохранить завершающие символы новой строки, вы можете добавить фиктивный символ к выводу подоболочки, а затем удалить его с расширением параметра.
function scan2 () {
local nl=$'\x0a'; # that's just \n
echo "output${nl}${nl}" # 2 in the string + 1 by echo
}
# append a character to the total output.
# and strip it with %% parameter expansion.
VAR=$(scan2; echo "x"); VAR="${VAR%%x}"
echo "${VAR}---"
отпечатков (сохранено 3 новых строки):
output
---
Использовать выходной параметр: избегая подоболочки (и сохраняя символы новой строки)
Если функция пытается «вернуть» строку в переменную, с bash v4.3 и выше, можно использовать то, что называется nameref
. Namerefs позволяет функции принимать имя выходных параметров одной или нескольких переменных. Вы можете присвоить вещи переменной nameref, и вы изменили ее так, как будто она «указывает на / ссылки».
function scan3() {
local -n outvar=$1 # -n makes it a nameref.
local nl=$'\x0a'
outvar="output${nl}${nl}" # two total. quotes preserve newlines
}
VAR="some prior value which will get overwritten"
# you pass the name of the variable. VAR will be modified.
scan3 VAR
# newlines are also preserved.
echo "${VAR}==="
печатает:
output
===
Эта форма имеет несколько преимуществ. А именно, это позволяет вашей функции изменять среду вызывающей стороны, не используя глобальные переменные везде.
Примечание: использование namerefs может значительно повысить производительность вашей программы, если ваши функции сильно зависят от встроенных команд bash, потому что это позволяет избежать создания подоболочки, которая выбрасывается сразу после этого. Как правило, это имеет больше смысла для небольших функций, часто используемых повторно, например, функции, оканчивающиеся на echo "$returnstring"
Это актуально. https://stackoverflow.com/a/38997681/5556676