如何使用bash将函数的输出分配给变量?
我有产生一些输出bash函数:如何使用bash将函数的输出分配给变量?
function scan {
echo "output"
}
我如何分配此输出到一个变量?
即, VAR =扫描(当然这不起作用 - 它使VAR等于字符串“扫描”)
您可以在命令/管道中使用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"
结尾的函数
我认为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
}
“local”内建函数将接受“声明”builtin将接受的任何选项。从一个快速测试中,它看起来好像在函数范围内声明-n也给出了变量的局部范围。看起来它们在这里可以互换。 – 2017-09-06 19:58:50
相关:http://*.com/q/3236871/435605 – 2016-07-18 13:01:05