如何使用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"
结尾的函数,
我认为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 }