編寫shell腳本過程當中,咱們常常會自定義一些函數,並根據函數的返回值不一樣來執行相應的流程,那麼咱們如何來獲取函數的返回值呢?
首先shell中調用函數有兩種方式:
第一種:value=`function_name [arg1 arg2 ......]` 或 第二種:function_name [arg1 arg2 ......] echo $?
這兩種有什麼區別呢? mysql
舉個例子來講:
[root@zejin240 ~]# cat test.sh #!/bin/sh
function aaa() { if [ "$1" -eq "1" ];then return 0
elif [ "$1" -eq "2" ];then exit 1
elif [ "$1" -eq "3" ];then
echo "3"
echo "31" >&2 #no space after >
echo "32"
elif [ "$1" -eq "4" ];then a wrong commend fi } echo "begin" value1=`aaa 1` echo $?
echo "value1=$value1"
echo '---------------' value2=`aaa 2` echo $?
echo "value2=$value2"
echo '---------------' value3=`aaa 3` echo $?
echo "value3=$value3"
echo '---------------' value4=`aaa 4` echo $?
echo "value4=$value4"
echo "end" 輸出以下: [root@zejin240 ~]# sh test.sh begin 0 value1=
---------------
1 value2=
---------------
31
0 value3=3
32
--------------- test.sh: line 14: a: command not found 127 value4=
--------------- end
能夠看到,value1 value2 value3 value4的值取決於函數中的標準輸出的值,即函數體中的echo內容,注意value3的值,由於咱們將31的輸出定向到了標準錯誤輸出,而不會出如今value3的值中。 而咱們用$?得到的函數執行狀態值時,能夠看到,沒有加return和exit的直接返回它上一條命令執行的狀態值,因此echo "32"能夠正常返回,因此$?的值爲0,而a wrong command 因爲不能正常執行,而返回了一個非0的整數。
好了,那麼讓咱們來看下面一個命令:
[root@zejin240 ~]# /opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"' Warning: Using a password on the command line interface can be insecure. version 5.6.16-log
輸出中出現了一個讓人有點討厭的警告,可是呢,當我把命令的值賦與變量aa時
[root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"'` Warning: Using a password on the command line interface can be insecure. [root@zejin240 ~]# echo "$aa" version 5.6.16-log
你會發現,變量aa的值並無包含那個警告信息。爲何呢,看了上面的分析可否知道緣由呢
緣由是這樣子的,雖然在界面顯示出來了警告信息,但這個警告信息是被重定向到標準錯誤輸出的,並不會被賦值給變量aa,我是怎麼知道的呢
咱們能夠這樣作個實驗:
[root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"' 2>&1 ` [root@zejin240 ~]# echo "$aa" Warning: Using a password on the command line interface can be insecure. version 5.6.16-log
我將標準錯誤輸出重定位到標準輸入,你看,這變量aa的值就包含警告信息了吧。
固然咱們也能夠將標準輸出重定向到空設備中:
[root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"' >/dev/null 2>&1` [root@zejin240 ~]# echo "$aa"
你看,aa的值就爲空了吧。(即便是定向到某個文件中輸出也爲空)
總結:調用函數返回值時,無論方法一仍是方法二,echo $?的值是同樣的。而方法一中,即value=`function_name [arg1 arg2 ......]`,value的取值取決於調用命令的標準輸出,沒有標準輸出即爲空,咱們通常用return值來返回函數的最後執行狀態,(通常不用exit來返回,由於它直接調用時會直接結束整個shell,固然若是有特殊目的能夠這樣作),用echo來輸出給到變量的值。