下面是我的shell脚本。如何比较while循环条件块中函数的退出状态?无论我从check1
函数返回什么,我的代码都会进入while循环
#!/bin/sh
check1()
{
return 1
}
while [ check1 ]
do
echo $?
check1
if [ $? -eq 0 ]; then
echo "Called"
else
echo "DD"
fi
sleep 5
done
答案 0 :(得分:10)
删除test
命令 - 也称为[
。所以:
while check1
do
# Loop while check1 is successful (returns 0)
if check1
then
echo 'check1 was successful'
fi
done
从Bourne和POSIX shell派生的shell在条件语句之后执行命令。查看它的一种方法是while
和if
测试成功或失败,而不是真或假(尽管true
被认为是成功的。)
顺便说一句,如果你必须明确地测试$?
(通常不需要),那么(在Bash中)(( ))
结构通常更容易阅读,如:
if (( $? == 0 ))
then
echo 'worked'
fi
答案 1 :(得分:8)
函数(或命令)执行返回的值存储在$?中,一个解决方案是:
check1
while [ $? -eq 1 ]
do
# ...
check1
done
更好更简单的解决方案可能是:
while ! check1
do
# ...
done
在此形式中,零为真,非零为假,例如:
# the command true always exits with value 0
# the next loop is infinite
while true
do
# ...
您可以使用!
取消值:
# the body of the next if is never executed
if ! true
then
# ...
答案 2 :(得分:0)
为了完整起见,另一种方法是使用 while
的内联函数退出代码
while check1 ; [ $? -eq 0 ] ; do
来自here
如果将方法更改为“echo”style return value,也可以使用参数。
while [ $(check1 my_param) < 33] ; do ...