我如何设置$?还是Bash中的返回码?

问题描述 投票:27回答:9

我想设置一次返回值,以便它进入while循环:

#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0    
done

为了使此功能正常运行,我需要在开始时设置$? = 1,但这不起作用。

bash error-handling return-value exit-code
9个回答
11
投票
#!/bin/bash

RC=1

while [ $RC -eq 1 ]
do

  #do something until it returns 0    

  RC=$?
done

109
投票

您可以通过在子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(或脚本)或subshel​​l *)使用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 离开循环,但其参数是要突破的循环级别数,而不是返回代码。

使用breakset +mset +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

[所有其他解决方案,例如falsefunction 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


17
投票
[echo总是返回退出代码1。

6
投票
某些答案依赖于重写代码。在某些情况下,它可能是您无法控制的外来代码。

4
投票
我认为您可以通过在进入function false() { echo "$$"; return ${1:-1}; } false 42 循环之前运行肯定会失败的命令来隐式地执行此操作。

2
投票
没有发现比简单功能更轻的东西:

1
投票
这样的东西会是您想要的吗?

1
投票
旧问题,但是有一个更好的答案:

0
投票
您可以使用#!/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

© www.soinside.com 2019 - 2024. All rights reserved.