mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2104 (markdown)
54
SC2104.md
Normal file
54
SC2104.md
Normal file
@@ -0,0 +1,54 @@
|
||||
## In functions, use return instead of break.
|
||||
|
||||
### Problematic code:
|
||||
|
||||
```sh
|
||||
foo() {
|
||||
if [[ -z $1 ]]
|
||||
then
|
||||
break
|
||||
fi
|
||||
echo "Hello $1"
|
||||
}
|
||||
```
|
||||
|
||||
### Correct code:
|
||||
|
||||
```sh
|
||||
foo() {
|
||||
if [[ -z $1 ]]
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
echo "Hello $1"
|
||||
}
|
||||
```
|
||||
### Rationale:
|
||||
|
||||
`break` or `continue` are used to abort or continue a loop, and are not the right way to exit a function. Use `return` instead.
|
||||
|
||||
### Exceptions:
|
||||
|
||||
The `break` or `continue` may be intended for a loop that calls the function:
|
||||
|
||||
```
|
||||
# Rarely valid
|
||||
foo() { break; echo $?; }
|
||||
while true; do foo; done
|
||||
```
|
||||
|
||||
This is undefined behavior in POSIX sh. Different shells do different things.
|
||||
|
||||
When the function is called from a loop:
|
||||
|
||||
* `ksh` keeps going and `$?` is 0.
|
||||
* `bash` version 4.4+ prints an error "break: only meaningful in a \`for', \`while', or \`until' loop", the function keeps going, and `$?` is 0.
|
||||
* `bash` versions before 4.4, will return from the function, break the loop calling the function, or exit a subshell if there's one in between.
|
||||
* `dash`, BusyBox `ash`: like above.
|
||||
|
||||
When the function is not called from a loop:
|
||||
|
||||
* All `bash` versions print an error "break: only meaningful in a \`for', \`while', or \`until' loop", the function keeps going, and `$?` is 0.
|
||||
* `ksh`, `dash` and `ash` silently keep going and `$?` is 0.
|
||||
|
||||
Due to the many different implementations, many of which are not helpful, it's recommended to use proper flow control. A typical solution is making sure the function `return`s success/failure, and calling `myfunction || break` in the loop.
|
Reference in New Issue
Block a user