exit 语句不会中断 unix shell 中的 while 循环

TyC*_*TyC 2 unix shell while-loop

每个状态检查 if 语句中的 exit 语句不会中断 while 循环并真正退出脚本。我可以做些什么来打破循环并使用 $STATUS 代码退出吗?

编辑:我已经更新了我的代码,但它仍然无法正常工作。状态检查 if 语句成功打破了循环,但当我尝试评估 $EXIT_STATUS 时,它始终为空,可能与范围有关。我在这里缺少什么?

  if [ $RESTART -le $STEP ]; then
  . tell_step

  while read XML_INPUT; do

    XML_GDG=`get_full_name $GDG_NAME P`

    cp $XML_INPUT $XML_GDG


    STATUS=$?
    EXIT_STATUS=$STATUS
    if [ $STATUS -ne 0 ]; then
      break
    fi

    add_one_gen $XML_GDG

    STATUS=$?
    EXIT_STATUS=$STATUS
    if [ $STATUS -ne 0 ]; then
      break
    fi

  done < $XML_STAGE_LIST

  echo $EXIT_STATUS
  if [ $EXIT_STATUS -ne 0 ]; then
    exit $EXIT_STATUS
  fi

fi
Run Code Online (Sandbox Code Playgroud)

JCH*_*H2k 7

我遇到了同样的问题:当管道进入 while 循环时,脚本在退出时没有退出。相反,它的工作方式就像“休息”应该做的那样。

我找到了2个解决方案:

a) 在 while 循环之后检查 while 循环的返回代码并退出:

somecommand | while something; do
    ...
done
# pass the exit code from the while loop
if [ $? != 0 ]
then
    # this really exits
    exit $?
fi
Run Code Online (Sandbox Code Playgroud)

b) 将 bash 脚本设置为在出现任何错误时退出。将其粘贴到脚本的开头:

set -e
Run Code Online (Sandbox Code Playgroud)