如何获得退出状态在bash循环(How to get the exit status a loop

2019-07-17 14:55发布

我知道如何检查使用$以前执行的命令的状态?我们可以使用exit命令作出这样的状态。 但在bash的循环总是返回状态0,是有什么办法可以破解一些状态的循环。

#!/bin/bash
while true
do
        if [ -f "/test" ] ; then
                break ### Here I would like to exit with some status
        fi

done
echo $?  ## Here I want to check the status.

Answer 1:

循环的状态是执行的最后一个命令的状态。 您可以使用break跳出循环,但如果突破成功,则循环的状态将是0 。 但是,你可以使用一个子shell和退出,而不是破坏。 换一种说法:

for i in foo bar; do echo $i; false; break; done; echo $?  # The loop succeeds
( for i in foo bar; do echo $i; false; exit; done ); echo $? # The loop fails

你也可以把循环的功能,从它返回一个值。



Answer 2:

像这样的事情?

while true; do
    case $RANDOM in *0) exit 27 ;; esac
done

还是这样吗?

rc=0
for file in *; do
    grep fnord "$file" || rc=$?
done
exit $rc

真正的问题是决定循环的退出代码是否应该是成功还是失败,如果一个迭代失败。 有场景,其中一个更有意义比其他,和其他地方不是在所有明确。



Answer 3:

bash的手册说:

while list-1; do list-2; done
until list-1; do list-2; done
  [..]The exit status of the while and until commands is the exit status
  of the last command executed in list-2, or zero if none was executed.[..]

即在循环执行的最后一个命令是break 。 而出口值break为0(见: help break )。

这就是为什么你的程序保持与0退出。



Answer 4:

内建对于bash确实允许你完成你在做什么突破,只是负值和$返回的状态打破? 将1:

while true
do
    if [ -f "./test" ] ; then
            break -1
    fi
done
echo $?  ## You'll get 1 here..

请注意,这是在帮助打破内置记载:

help break

打破:打破[n]的退出,同时,或直到环路。

退出FOR,WHILE或直至循环。 如果指定了N,打破封闭ñ循环。

退出状态:退出状态是0,除非N为不大于或等于1。

你可以打破循环的n个或以非回零破发负值,即1

我同意@hagello作为一个选项做了睡眠和改变环路:

#!/bin/bash
timeout=120
waittime=0
sleepinterval=3
until [[ -f "./test" || ($waittime -eq $timeout) ]]
do
   $(sleep $sleepinterval)
   waittime=$((waittime + sleepinterval))
   echo "waittime is $waittime"
done

if [ $waittime -lt $sleepinterval ]; then
    echo "file already exists"
elif [ $waittime -lt $timeout ]; then
    echo "waited between $((waittime-3)) and $waittime seconds for this to finish..."
else
    echo "operation timed out..."
fi


Answer 5:

我想你应该问的是: 我怎样才能等到一个文件或目录( /test )获取由另一个进程创建?

你现在正在做的最多是轮询满功率。 你的循环将分配高达一个核的处理能力的100%。 关键词是“投票”,这是由计算机科学家的标准不道德

有两种补救措施:

  1. 插入您的循环睡眠声明; 优点:很简单; 缺点:延迟将是CPU负载和响应之间的任意的折衷。 (“任意”是不道德,太)。
  2. 使用通知机制类似inotify (参见: man inotify ); 优点:无CPU负载,极大响应,没有延迟,在你的代码中没有任意常数; 缺点: inotify是一个内核API -你需要一些代码来访问它: inotify-tools或一些C /的Perl / Python代码。 看看inotify的和bash !


文章来源: How to get the exit status a loop in bash
标签: linux bash shell