Подтвердить что ты не робот

Как назначить вывод функции переменной с помощью bash?

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

function scan {
  echo "output"
}

Как назначить этот вывод переменной?

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

4b9b3361

Ответ 1

VAR=$(scan)

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

Ответ 2

Вы можете использовать функции bash в командах/конвейерах, поскольку в противном случае вы использовали бы обычные программы. Эти функции также доступны для подсетей и транзитно, Command Substitution:

VAR=$(scan)

Является ли метод strighforward для достижения желаемого результата в большинстве случаев. Ниже я расскажу о специальных случаях.

Сохранение завершающих строк:

Один из (обычно полезных) побочных эффектов Command Substitution заключается в том, что он лишит любое количество завершающих строк новой строки. Если вы хотите сохранить завершающие символы новой строки, можно добавить фиктивный символ для вывода подоболочки и впоследствии разделить его с расширением параметра.

function scan2 () {
    local nl=$'\x0a';  # that 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"

Это актуально. fooobar.com/questions/20690/...

Ответ 3

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

function scan3() {
    declare -n outvar=$1    # -n makes it a nameref.
    local nl=$'\x0a'
    outvar="output${nl}${nl}"  # two total. quotes preserve newlines
}