如何在循环中的函数中处理返回?

时间:2014-01-03 18:13:02

标签: bash while-loop return

我有一个函数,在函数内部是一个while循环。

当我尝试使用IF语句在while循环中设置非局部变量时,退出整个函数,突然变量不再被设置?

function EXAMPLE {
  cat test.txt | while read LINE; do
    if [ "$LINE" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done
}

### START SCRIPT ###
EXAMPLE (Call example function)
echo "$RETURN"

出于某种原因,RETURN为空。我过去曾多次这样做过很多次。关于while循环的一些事情是阻止RETURN传递出函数。是“返回”导致脚本打破循环而不是函数吗?

由于

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是首先使用输入重定向而不是管道来避免子shell。

function EXAMPLE {
  while IFS= read -r line; do
    if [ "$line" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done < test.txt
}

在管道不可避免的情况下,bash 4.2引入了lastpipe选项,该选项在启用时允许管道中的最后一个命令在当前shell中运行,而不是子shell。这样,在管道完成后,将保留分配给RETURN的值。

更好的是,使用标准机制发出错误信号。不要设置自定义参数的值,只需返回非零值:

function EXAMPLE {
  while IFS= read -r line; do
    if [ "$line" = "FAIL" ]; then
      echo "Detected FAIL in file! Exiting function with status 1."
      return 1
    fi
  done < test.txt
}

答案 1 :(得分:1)

在bash中使用管道时,管道中的所有命令都在子shell中执行。这意味着当子shell退出时变量无法生存。在这个美食中,很容易移除管道

function EXAMPLE {
  while read LINE; do
    if [ "$LINE" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done < text.txt
}

我建议不经常使用ALL CAPS:有一天你会使用一个名为PATH的变量,然后必须找出命令停止工作的原因。