Как я могу назначить вывод функции для переменной, используя bash? - PullRequest
73 голосов
/ 27 ноября 2009

У меня есть функция bash, которая выдает какой-то вывод:

function scan {
  echo "output"
}

Как я могу присвоить этот выход переменной?

т. VAR = scan (конечно, это не работает - это делает VAR равным строке «scan»)

Ответы [ 3 ]

112 голосов
/ 27 ноября 2009
VAR=$(scan)

Точно так же, как для программ.

14 голосов
/ 08 октября 2016

Вы можете использовать функции 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

0 голосов
/ 30 апреля 2017

Я думаю, что init_js должен использовать объявление вместо локального!

function scan3() {
    declare -n outvar=$1    # -n makes it a nameref.
    local nl=$'\x0a'
    outvar="output${nl}${nl}"  # two total. quotes preserve newlines
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...