从 Bash 变量返回本地值?

从 Bash 变量返回本地值?

我研究了这篇文章叫从 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 :unsetset

function return_local()
{
  unset $1 # must be local
  eval "$1=\"\$2\""
}

我们必须使用evalnot ,declare因为当我们需要创建一个非本地未导出变量时,它确实会创建一个本地变量或导出变量。

function test()
{
  local my_return_value=123
  # ...
  return_local my_return_value "$my_return_value"
}

unset指令删除了最内部的local变量,因此您必须return_local在每个想要返回局部变量的函数中编写。因此return_local可以在嵌套调用上下文中使用。

只要创建单独的进程就不需要使用$(...)运算符,这在 Windows 下的 bash 中会降低性能,因为在那里创建进程并不便宜。

相关内容