1

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

编辑:我已经更新了我的代码,但它仍然无法正常工作。如果语句成功中断循环,则状态检查,但是当我尝试评估 $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
4

4 回答 4

4

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

我找到了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

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

set -e
于 2015-10-16T15:26:38.950 回答
3

不太明白为什么你的脚本不会在退出时退出,因为下一个是没有问题的:

while read name; do
    echo "checking: $name"
    grep $name /etc/passwd >/dev/null 2>&1
    STATUS=$?
    if [ $STATUS -ne 0 ]; then
        echo "grep failed for $name rc-$STATUS"
        exit $STATUS
    fi
done <<EOF
root
bullshit
daemon
EOF

运行它,产生:

$ bash testscript.sh ; echo "exited with: $?"
grep failed for bullshit rc-1
exited with: 1

如您所见,脚本立即退出并且不检查“守护进程”。

无论如何,也许它更具可读性,当您使用时bash functions

dostep1() {
    grep "$1:" /etc/passwd >/dev/null 2>&1
    return $?
}

dostep2() {
    grep "$1:" /some/nonexistent/file >/dev/null 2>&1
    return $?
}

err() {
    retval=$1; shift;
    echo "$@" >&2 ; return $retval
}

while read name
do
    echo =checking $name=
    dostep1 $name || err $? "Step 1 failed" || exit $?
    dostep2 $name || err $? "Step 2 failed" || exit $?
done

当运行时:

echo 'root
> bullshit' | bash testexit.sh; echo "status: $?"
=checking root=
Step 2 failed
status: 2

所以,第 1 步没问题并在第 2 步(不存在的文件)上退出 - grep 退出状态 2,当

echo 'bullshit
bin' | bash testexit.sh; echo "status: $?"
=checking bullshit=
Step 1 failed
status: 1

在第 1 步立即退出(废话不在 /etc/passwd 中)- grep 退出状态 1

于 2013-07-23T13:34:02.940 回答
0

您需要break退出循环,然后exit退出脚本。您可以使用设置为错误的变量来测试您是否需要exit使用错误条件。

于 2013-07-23T12:52:48.440 回答
0

流水线时我遇到了类似的问题。我的猜测是流水线时会启动一个单独的外壳。希望它可以帮助其他偶然发现问题的人。

从上面 jm666 的帖子中,这不会打印“我在这里!”:

while read name; do
   echo "checking: $name"
   grep $name /etc/passwd >/dev/null 2>&1
   STATUS=$?
   if [ $STATUS -ne 0 ]; then
      echo "grep failed for $name rc-$STATUS"
      exit $STATUS
   fi
done <<EOF
root
yayablah
daemon
EOF

echo "Here I am!"

但是,将名称通过管道传输到 while 循环的以下内容确实如此。它也会以代码 0 退出。设置变量和breaking 似乎也不起作用(如果它是另一个 shell,这很有意义)。需要使用另一种方法来传达错误或首先避免这种情况。

cat <<EOF |
root
yayablah
daemon
EOF
while read name; do
   echo "checking: $name"
   grep $name /etc/passwd >/dev/null 2>&1
   STATUS=$?
   if [ $STATUS -ne 0 ]; then
      echo "grep failed for $name rc-$STATUS"
      exit $STATUS
   fi
done

echo "Here I am!"
于 2013-12-09T23:53:16.187 回答