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

我有一个bash函数产生一些输出:

function scan { echo "output" } 

我怎样才能把这个输出分配给一个variables?

即。 VAR =扫描(当然这不起作用 – 它使VAR等于string“扫描”)

 VAR=$(scan) 

与程序完全一样。

您可以在命令/pipe道中使用bash函数,否则将使用常规程序。 这些function也可以通过subhells和transitively,命令replace:

 VAR=$(scan) 

在大多数情况下,达到你想要的结果是直截了当的方法。 我将在下面概述特殊情况。

保留尾随的换行符:

其中一个(通常是有用的)命令replace的副作用是它将剥离任何数量的尾随换行符。 如果希望保留尾随的换行符,可以附加一个虚拟字符来输出子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个换行符):

 output --- 

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

如果函数试图实现的是用bash v4.3或更高版本将一个string“返回”到一个variables中,那么可以使用所谓的nameref 。 Namerefs允许函数获取一个或多个variables输出参数的名称。 你可以把一些东西分配给一个namerefvariables,就好像你改变了它指向/引用的variables。

 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 === 

这种forms有一些优点。 也就是说,它允许你的函数在不使用全局variables的情况下修改调用者的环境。

注意:如果函数严重依赖bash内build函数,那么使用namerefs可以大大提高程序的性能,因为它避免了刚创build的子shell。 这通常对于经常重用的小函数更有意义,例如以echo "$returnstring"结尾的函数,

这是相关的。 https://stackoverflow.com/a/38997681/5556676

我认为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 }