Unix shell自定義函數的簡介及使用
一、無參函數
沒有參數的函數,直接調用實現某些功能。
函數編寫在腳本中,與其他命令一起存儲,但是函數必須定義在腳本的最開始部分;
也就是說,包含函數的腳本中,所有的函數都得定義在腳本的最開始部分;
然後在定義函數之後調用或者在其他腳本中引用這些定義的函數。
www.2cto.com
實例1、下面是一個簡單的自定義函數,求1到10的和:
[plain]
pg no_param_test
#!/bin/ksh
# 測試無參自定義函數 www.2cto.com
# author:_yeeXun
# date :2013-3-4 8:37:29
no_param_test() {
SUM=0
#for i in { 1..10 }
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
SUM=`expr $SUM + $i`
i=`expr $i + 1`
if [ $i -eq 11 ]; then
echo "Sum:$SUM"
fi
done
}
no_param_test
# EOF
執行腳本:
sh no_param_test
1
2
3
4
5
6
7
8
9
10
Sum:55
二、有參函數
帶參數的自定義函數,在高級語言(如,C,JAVA,C#等)中,參數都是在函數後面的括號中;
而shell中則在函數體內檢查參數個數。在調用函數的時候,直接在後面跟著參數即可。
無論參數有多少個,都緊跟在函數名後面。
1、單個參數
實例2、腳本如下:
[plain]
pg direc_check
#!/bin/ksh
is_directory() {
_DIR_NAME=$1
# check params
if [ $# -lt 1 ]; then
echo "is_directory:I need a directory name to check"
return 1
fi
# check
if [ ! -d $_DIR_NAME ]; then
return 1
else
return 0
fi
}
error_msg() {
echo "**********"
echo $@
echo "**********"
return 0
}
echo -n "Enter destination directory:"
read DIR
if is_directory $DIR
then
echo "$DIR is a directory and exists in $PWD"
else
error_msg "$DIR does not exist ... creating it now"
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
error_msg "Could not create directory::chech it out!"
exit 1
else :
fi
fi
# author:_yeeXun
# date :2013-3-2 15:27:57
# EOF
這裡函數中# check params部分就是在做參數檢查,這裡$#表示輸入的參數個數。
下面是執行這個腳本:
sh direc_check
Enter destination directory:test
**********
test does not exist ... creating it now
**********
再次執行時候,輸入同樣的名稱,則會提示此目錄已經存在。
sh direc_check
Enter destination directory:test
test is a directory and exists in /usr/b4nx/user/ytcclb
我們在添加一個目錄,通過awk語言查看當前目錄下通過此腳本創建的目錄:
[plain]
ls -l | awk '{if($0~/^d/) print $0}'
drwxr-xr-x 2 b4nx group 512 Mar 2 15:32 call_fun_test
drwxr-xr-x 2 b4nx group 512 Mar 2 15:04 test
2、多個參數
不管是單個參數,還是多個參數,都通過檢查判斷,這裡$#表示輸入的參數個數;
$1表示輸入的第一個參數,$2表示第二個,$3表示第四個,以此類推。
下面是一個截取字符串的函數:
實例3、pg chop
[plain]
#!/bin/ksh
# chop
# to call:chop string how_many_chars_to_chop
chop() {
_STR=$1
_CHOP=$2
# awk's substr starts at 0,wo need to increment by one
CHOP=`expr $_CHOP + 1`
# check we have two params
if [ $# -ne 2 ]; then
echo "check_length:I need a string and how many characters to chop"
return 1
fi
# check the length of the string first
_LENGTH=`echo $_STR | awk '{print length($0)}'`
if [ "$_LENGTH" -lt "$_CHOP" ]; then
echo "The length of the string is short"
return 1
fi
echo $_STR | awk '{print substr($1,'$_CHOP')}'
}
# call the function
echo -n "Enter the string:"
read STR
echo -n "Enter the start position:"
read LEN
chop $STR $LEN
# author:_yeeXun
# date :2013-3-2 14:17:34
# EOF
這個腳本中,定義了一個函數chop截取字符串,2個參數,分別用$1,$2表示;
$1表示被截取的字符串,$2表示截取的起始位置。執行如下:
sh chop
Enter the string:string123
Enter the start position:5
ng123
sh chop
Enter the string:_yeexunInCSDN
Enter the start position:10
CSDN
三、函數返回值
函數的返回值表示執行函數的一個狀態,
1、return 0:正常返回。
2、return 1:返回錯誤。
3、return :最後的命令執行狀態決定返回值,可使用$?檢測。
四、函數調用
1、同腳本
腳本中,函數必須在腳本一開始就定義,定義之後才可調用。
同一腳本中,在頂部定義函數,定義完後再調用,如實例1、實例2、實例3。
2、腳本間
可以將這些函數定義在同一個腳本中,作為公共使用的函數腳本,然後再需要調用的腳本中引用此腳本即可。
引用方式如下:<dot><space><directory><script>
實例4、函數調用 — 跨腳本
函數腳本:
[plain]
pg direc_check.sh
#!/bin/ksh
is_directory() {
_DIR_NAME=$1
# check params
if [ $# -lt 1 ]; then
echo "is_directory:I need a directory name to check"
return 1
fi
# check
if [ ! -d $_DIR_NAME ]; then
return 1
else
return 0
fi
}
error_msg() {
echo "**********"
echo $@
echo "**********"
return 0
}
# 多行注釋方式::<<' ... '
:<<'
echo -n "Enter destination directory:"
read DIR
if is_directory $DIR
then
echo "$DIR is a directory and exists in $PWD"
else
error_msg "$DIR does not exist ... creating it now"
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
error_msg "Could not create directory::chech it out!"
exit 1
else :
fi
fi
'
# author:_yeeXun
# date :2013-3-2 15:27:57
# EOF
調用此腳本中函數的腳本:
[plain]
pg fun_test
#!/bin/ksh
# call the function outside the script is_drectory
# <dot><space><directory with functions><script with functions>
. $HOME/user/ytcclb/direc_check.sh
echo -n "Enter destination directory:"
read DIR
if is_directory $DIR
then
echo "$DIR is a directory and exists in $PWD"
else
error_msg "$DIR does not exist ... creating now"
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
error_msg "Could not create directory::check it out"
exit 1
else :
fi
fi
# author:_yeeXun
# date :2013-3-2 15:49:12
# EOF
當輸入一個已存在的目錄時候:
sh fun_test
Enter destination directory:test
test is a directory and exists in /usr/b4nx/user/ytcclb
輸入不存在的目錄名:
sh fun_test
Enter destination directory:dir_test
**********
dir_test does not exist ... creating now
**********
查看當前目錄下所有目錄名:
[plain]
ls -l | awk '{if($0~/^d/) print $0}'
drwxr-xr-x 2 b4nx group 512 Mar 2 15:32 call_fun_test
drwxr-xr-x 2 b4nx group 512 Mar 4 14:16 dir_test
drwxr-xr-x 2 b4nx group 512 Mar 2 15:04 test
--the end--