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

问题描述:

我有产生一些输出bash函数:如何使用bash将函数的输出分配给变量?

function scan { 
    echo "output" 
} 

我如何分配此输出到一个变量?

即, VAR =扫描(当然这不起作用 - 它使VAR等于字符串“扫描”)

+1

相关:http://*.com/q/3236871/435605 – 2016-07-18 13:01:05

VAR=$(scan) 

与程序完全一样。

+0

这样做可以保留换行吗? – Brent 2009-11-27 17:46:00

+2

我发现当我做“echo $ VAR”时,换行符被剥离。如果我引用$ VAR,它会保留换行符。 – Brent 2009-11-27 17:58:55

+2

这不是100%正确的。命令替换总是去掉尾随的换行符。 – TheBonsai 2009-11-28 17:36:53

您可以在命令/管道中使用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个换行符保持):

output 


--- 

使用输出参数:避免子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。这通常对于经常重复使用的小功能更有意义,例如,以echo "$returnstring"结尾的函数

这是相关的。 https://*.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 
} 
+0

“local”内建函数将接受“声明”builtin将接受的任何选项。从一个快速测试中,它看起来好像在函数范围内声明-n也给出了变量的局部范围。看起来它们在这里可以互换。 – 2017-09-06 19:58:50