echo
总是返回退出代码1。我想设置一次返回值,以便它进入while循环:
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
为了使此功能正常运行,我需要在开始时设置$? = 1
,但这不起作用。
#!/bin/bash
RC=1
while [ $RC -eq 1 ]
do
#do something until it returns 0
RC=$?
done
您可以通过在子shell中使用参数执行exit
来设置任意退出代码。
$ (exit 42); echo "$?"
42
所以您可以这样做:
(exit 1) # or some other value > 0 or use false as others have suggested
while (($?))
do
# do something until it returns 0
done
或者您可以emulate a do while
loop:
do while
这两项保证循环至少运行一次,我相信这是您的目标。
[为了完整起见,while
# do some stuff
# do some more stuff
# do something until it returns 0
do
continue # just let the body of the while be a no-op
done
和exit
各自接受一个可选参数,该参数是整数(正,负或零),该参数将返回码设置为除以256后的整数的余数。当前的shell(或脚本)或subshell *)使用return
退出,并使用exit
退出功能。
实施例:
return
*即使对于由管道创建的子外壳,这也是正确的(除非同时禁用了两个作业控制并且启用了$ (exit -2); echo "$?"
254
$ foo () { return 2000; }; foo; echo $?
208
):
lastpipe
请注意,最好使用$ echo foo | while read -r s; do echo "$s"; exit 333; done; echo "$?"
77
离开循环,但其参数是要突破的循环级别数,而不是返回代码。
使用break
,set +m
或set +o monitor
禁用了作业控制。要启用shopt -u -o monitor
,请执行lastpipe
。如果您同时执行了这两个操作,则上一示例中的shopt -s laspipe
将导致exit
循环和包含外壳的<>退出,并且最终的while
将不执行。 >
echo
总是返回退出代码1。false
某些答案依赖于重写代码。在某些情况下,它可能是您无法控制的外来代码。尽管对于这个特定问题,设置$就足够了?设置为1,但是是否需要设置$?任何价值-唯一有用的答案是Dennis Williamson的答案。
一种更有效的方法,它不会产生新的孩子(但也不太简洁)是:
#!/bin/bash false while [ $? -eq 1 ] do #do something until it returns 0 done
注意:回声部分仅用于验证它是否在当前进程中运行。我认为您可以通过在进入function false() { echo "$$"; return ${1:-1}; } false 42
循环之前运行肯定会失败的命令来隐式地执行此操作。这样的规范命令当然是
while
。没有发现比简单功能更轻的东西:[所有其他解决方案,例如false或function set_return() { return ${1:-0}; }
或(...)
可能包含一个外部过程调用。这样的东西会是您想要的吗?
[...]
旧问题,但是有一个更好的答案:
false
如果要循环播放直到成功,则可以在直到部分中执行该操作。您可以将完全相同的代码放入您认为必须放入do / done部分的“直到”部分。您不必强制在do / done部分中编写代码,然后将其结果传输回while或直到。您可以使用#!/bin/bash TEMPVAR=1 while [ $TEMPVAR -eq 1 ] do #do something until it returns 0 #construct the logic which will cause TEMPVAR to be set 0 then check for it in the #if statement if [ yourcodehere ]; then $TEMPVAR=0 fi done
处理#!/bin/bash until #do something until it returns success do :; done
返回1或0以外的值的情况:
until
echo
总是返回退出代码1。function false() { echo "$$"; return ${1:-1}; }
false 42
循环之前运行肯定会失败的命令来隐式地执行此操作。#!/bin/bash
TEMPVAR=1
while [ $TEMPVAR -eq 1 ]
do
#do something until it returns 0
#construct the logic which will cause TEMPVAR to be set 0 then check for it in the
#if statement
if [ yourcodehere ]; then
$TEMPVAR=0
fi
done
处理#!/bin/bash
until
#do something until it returns success
do
:;
done
返回1或0以外的值的情况:until