Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bash将函数的输出分配给变量?_Bash_Variables_Function - Fatal编程技术网

如何使用bash将函数的输出分配给变量?

如何使用bash将函数的输出分配给变量?,bash,variables,function,Bash,Variables,Function,我有一个bash函数,可以生成一些输出: function scan { echo "output" } 如何将此输出分配给变量? ie.VAR=scan(当然这不起作用-它使VAR等于字符串“scan”) 与程序完全相同。您可以在命令/管道中使用bash函数,就像在其他情况下使用常规程序一样。这些函数也可用于子shell和可传递的命令替换: VAR=$(scan) 在大多数情况下,这是实现您想要的结果的捷径。我将在下面概述一些特殊情况 保留尾部换行: 命令替换的一个(通常是有用的)副作

我有一个bash函数,可以生成一些输出:

function scan {
  echo "output"
}
如何将此输出分配给变量?

ie.VAR=scan(当然这不起作用-它使VAR等于字符串“scan”)


与程序完全相同。

您可以在命令/管道中使用bash函数,就像在其他情况下使用常规程序一样。这些函数也可用于子shell和可传递的命令替换:

VAR=$(scan)
在大多数情况下,这是实现您想要的结果的捷径。我将在下面概述一些特殊情况

保留尾部换行:

命令替换的一个(通常是有用的)副作用是,它将去除任意数量的尾随换行符。若希望保留尾随的换行符,可以在子shell的输出中附加一个伪字符,然后使用参数展开将其剥离

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条换行):

使用输出参数:避免子shell(并保留换行)

如果函数试图通过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

===
这种形式有几个优点。也就是说,它允许您的函数修改调用者的环境,而无需到处使用全局变量

注意:如果您的函数严重依赖bash内置函数,那么使用namerefs可以极大地提高程序的性能,因为它避免了创建一个子shell,而子shell在创建后不久就会被丢弃。这通常对于经常重用的小函数更有意义,例如以
echo“$returnstring”


这是相关的

我认为init_js应该使用declare而不是local

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

当我做“echo$VAR”时,我发现新行被删除了。如果我引用$VAR,它保留了换行符。这不是100%正确。命令替换总是去除尾随的换行符;有没有办法在同一个shell中实现这一点?@lmat您可以使用bash4.3及更高版本中的
nameref
来实现这一点。介绍了一些概念。相关:
本地
内置将接受
声明
内置将接受的任何选项。从快速测试来看,函数作用域中的
declare-n
似乎也给出了变量的局部作用域。看起来它们在这里是可以互换的。
output

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