我研究了这篇文章叫从 Bash 函数返回值。数据
Lorem.
\begin{document}
hello
\end{document}
情况 #1 不起作用
代码
#!/bin/bash
function getStart {
local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
}
START2=$(getStart)
echo $START2
它错误地返回一个空行。我预计1
。
为什么脚本返回空行?
案例 #2 有效
代码
#!/bin/bash
function getStart {
local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
echo $START
}
getStart
打印正确1
。
choroba 答案的输出
#!/bin/bash
function getStart {
local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
echo $START
}
START2=$(getStart)
echo $START2
仅给出行号一次,这不是预期的结果。我认为应该做两次。
答案1
$(...)
(又名“命令替换”)捕获命令的输出...
。为变量赋值不会产生任何输出,因此没有任何可捕获的内容。在情况 #2 中,echo
产生输出。
getStart () {
local l=Hallo
echo $l
}
v=$(getStart)
echo $v
回答您的更新:函数输出Hallo
.此输出由命令替换捕获,因为这就是命令替换所做的事情,因此直到 为止v=$(getStart)
,脚本不会产生任何输出。然后该行echo $v
输出Hallo
.
答案2
只需在其中运行 awk 命令,然后忘记捕获。函数可以回显某些内容,此外,它们还返回退出状态。如果您没有显式返回(例如,return 1
),函数的退出状态将是最后一个命令的退出状态。这就是为什么您可能不想在函数中捕获 + echo 的原因。它将用 echo 的退出状态(0,除非异常情况)来隐藏捕获命令的退出状态。
答案3
您可以使用简单的函数通过+local
从变量中删除-ness :unset
set
function return_local()
{
unset $1 # must be local
eval "$1=\"\$2\""
}
我们必须使用eval
not ,declare
因为当我们需要创建一个非本地未导出变量时,它确实会创建一个本地变量或导出变量。
function test()
{
local my_return_value=123
# ...
return_local my_return_value "$my_return_value"
}
该unset
指令删除了最内部的local
变量,因此您必须return_local
在每个想要返回局部变量的函数中编写。因此return_local
可以在嵌套调用上下文中使用。
只要创建单独的进程就不需要使用$(...)
运算符,这在 Windows 下的 bash 中会降低性能,因为在那里创建进程并不便宜。