函數返回值
函數的返回值是一個數字, 范圍是[0 - 255], 每一個函數都有返回值,或者
- 由顯式的return語句指定, 后面跟一個[0-255]之間的數字, 或者
- 如果沒有return語句,那么最后一條語句的返回值作為函數的返回值.
舉例子說明:
#!/bin/bash
function foo1() {
return 1
}
function foo2() {
ls *.sh
}
function foo3() {
ls *.ksh
}
foo1
echo "foo1 return $?"
foo2
echo "foo2 return $?"
foo3
echo "foo3 return $?"
- 函數foo1由顯式的return語句指定返回1.
- 函數foo2沒有return語句, 它將返回"ls *.sh"的返回值.
- 函數foo3沒有return語句, 它將返回"ls *.ksh"的返回值.
如果當前目錄下有.sh文件,而沒有.ksh文件,那么會得到如下運行結果:
$ ./test.sh
foo1 return 1
test.sh
foo2 return 0
ls: cannot access *.ksh: No such file or directory
foo3 return 2
其中foo3 return 2這個2是"ls *.ksh"命令的返回值.
腳本的返回值
腳本的返回值和函數的返回值一樣. 腳本的返回值也是一個數字, 范圍是[0 - 255], 或者
- 由顯式的exit語句指定, 后面跟一個[0-255]之間的數字, 或者
- 如果沒有exit語句,那么最后一條命令的返回值作為腳本的返回值.
舉例
$ cat t0.sh
#!/bin/bash
exit 0
$
$ cat t1.sh
#!/bin/bash
exit 1
$
$ cat t2.sh
#!/bin/bash
ls *.ksh
$
$ cat t.sh
#!/bin/bash
./t0.sh
echo "t0 return $?"
./t1.sh
echo "t1 return $?"
./t2.sh
echo "t2 return $?"
運行結果:
$ ./t.sh
t0 return 0
t1 return 1
ls: cannot access *.ksh: No such file or directory
t2 return 2
其中t2得返回值2就是最后一條命令"ls *.ksh"的返回值.
判斷函數是否執行成功
有些時候我們需要判斷一個函數是否成功, 來決定走不同的分支,
if funcall; then
...
else
...
fi
只要理解一點, 判斷函數是否執行成功的依據是函數返回值是否為零, 是零表示成功, 非零表示失敗. 看下面例子:
#!/bin/bash
function isOK1() {
return 0
}
function isOK2() {
return 100
}
if isOK1; then
echo "isOK1 return true"
else
echo "isOK1 return false"
fi
if isOK2; then
echo "isOK2 return true"
else
echo "isOK2 return false"
fi
運行結果如下:
$ ./test.sh
isOK1 return true
isOK2 return false
- 函數isOK1的返回值為0, bash認為調用成功.
- 函數isOK2的返回值為100, bash認為調用失敗.
判斷命令是否執行成功
和判斷函數是否執行成功一樣
注意
函數內return指令和exit指令的區別
- return只能在函數內部使用, 不能在函數外使用.
- exit指令可以在函數內,也可以在函數外使用.
- return從當前函數返回, 返回到調用者,繼續往下執行.
- exit從當前函數退出, 并直接退出當前進程, 返回父進程.
- 注意是退出一個當前進程, 而不是退出整個調用鏈, 我們知道shell里面每一個腳本都是在一個獨立的進程空間里面運行的, 所有exit命令只是退出exit命令所在腳本的進程, 然后從調用者腳本繼續往下執行.