BASH函数中返回和退出之间的区别

BASH函数中的exitexit语句与退出代码有什么区别?

return从函数返回一个值。 exit放弃当前的shell。

编辑:

根据您对问题的编辑,关于退出代码, return与退出代码无关。 退出代码适用于应用程序/脚本 ,而不是function。 所以在这方面,设置脚本退出码的唯一关键字(可以被调用程序使用$? shellvariables捕获的那个) exit

编辑2:

我最后一个提到exit声明引起了一些评论。 为了理解OP,区分了returnexit ,事实上,在程序/ shell脚本的任何给定点, exit是结束带有退出代码的脚本到调用进程的唯一方法。

在shell中执行的每个命令都会产生一个本地的“退出代码”:它设置$? 该代码是可变的,并且可以与if&&和其他运算符一起使用来有条件地执行其他命令。

这些退出代码(以及$?variables的值)由每个命令执行重置。

顺便说一句,由脚本执行的最后一个命令的退出代码被用作调用进程看到的脚本本身的退出代码。

最后,函数在调用时作为关于退出代码的shell命令。 函数的退出代码(函数 )通过使用return来设置。 所以当函数return 0 ,函数执行终止,退出代码为0。

return将导致当前函数超出范围,而exit将导致脚本在它被调用的地方结束。 这里是一个示例程序来帮助解释这个:

 #!/bin/bash retfunc() { echo "this is retfunc()" return 1 } exitfunc() { echo "this is exitfunc()" exit 1 } retfunc echo "We are still here" exitfunc echo "We will never see this" 

产量

 $ ./test.sh this is retfunc() We are still here this is exitfunc() 

我不认为有人真的完全回答了这个问题,因为他们没有描述如何使用这两个问题。 好吧,我认为我们知道exit会杀死脚本,在哪里调用脚本,还可以为其指定一个状态,如退出或退出0或退出7等等。 这可以用来确定脚本如何被其他脚本调用时被强制停止等。足够退出。

返回时调用将返回指定的值来指示函数的行为,通常为1或0.例如:

  #!/bin/bash isdirectory() { if [ -d "$1" ] then return 0 else return 1 fi echo "you will not see anything after the return like this text" } 

像这样检查:

  if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi 

或者像这样:

  isdirectory || echo "not a directory" 

在这个例子中,testing可以用来指示目录是否被find。 注意返回后的任何内容都不会在函数中执行。 0是真的,但在shell中false是1,不同于其他的编程语言。

有关function的更多信息: http : //www.linuxjournal.com/content/return-values-bash-functions

请记住,函数是脚本的内部函数,通常使用return语句返回它们。 调用外部脚本完全是另一回事,脚本通常以退出语句结束。

BASH函数中退出语句和退出语句之间的差别很小。 两者都返回一个状态,而不是本身。 状态为零表示成功,而其他状态(1至255)表示失败。 return语句将从所调用的位置返回到脚本,而exit语句将从遇到的任何脚本结束。

 return 0 # returns to where the function was called. $? contains 0 (success). return 1 # returns to where the function was called. $? contains 1 (failure). exit 0 # exits the script completely. $? contains 0 (success). exit 1 # exits the script completely. $? contains 1 (failure). 

如果函数只是以没有返回语句结束,那么最后一条执行的命令的状态将作为状态码返回(并放置在$? )。

请记住,返回和退出返回一个状态代码,从0到255,可用$? 。 你不能填充任何其他的状态码(例如返回“猫”)。 不起作用。 但是,脚本可以通过使用状态代码返回255个不同的失败原因。

您可以设置调用脚本中包含的variables,或者在函数中回显结果,并在调用脚本中使用命令replace; 但是返回和退出的目的是传递状态代码,而不是像C这样的编程语言期望的值或计算结果。

有时候,你使用脚本运行.source

 . a.sh 

如果你在a.sh包含一个exit ,它不会终止脚本,而是结束你的shell会话。

如果您在a.sh包含return ,则只是停止处理脚本。

简单来说(主要是针对新手编码),可以说,

 `return` : exits the function, `exit()` : exits the program(called as process while running) 

另外如果你观察,这是非常基本的,但…,

 `return` : is the keyword `exit()` : is the function 

首先, return是一个关键字, exit我的朋友是一个function。

这就是说,这是一个最简单的解释。

return它从函数返回一个值。

exit它退出或放弃当前的shell。

  • exit终止当前进程 ; 有或没有退出代码,认为这不仅仅是一个程序function。 请注意,采购时, exit将结束壳,但是,运行时将只是exit脚本。

  • 从函数返回返回到调用后的指令,有或没有返回码。 return是可选的,它在函数结束时是隐含的。 return只能在一个函数内部使用。

我想在添加源代码时添加一个函数内部的脚本,而不是在不使用shell的情况下exit 。 我认为,一个例子在“testing”脚本上更好

 #!/bin/bash function die(){ echo ${1:=Something terrible wrong happen} #... clean your trash exit 1 } [ -f /whatever/ ] || die "whatever is not available" # now we can proceed echo "continue" 

执行以下操作:

 user$ ./test Whatever is not available user$ 

test – 壳将closures。

 user$ . ./test Whatever is not available 

只有test完成,提示才会显示。

解决方法是将可能的程序包含在()

 #!/bin/bash function die(){ echo $(1:=Something terrible wrong happen) #... clean your trash exit 1 } ( # added [ -f /whatever/ ] || die "whatever is not available" # now we can proceed echo "continue" ) # added 

现在,在这两种情况下,只有test将退出。