1.使用函数
[oracle@XAG143 myshell]$ cat test_fun1.sh
#!/bin/bash
# using a function in a script
function func1
{
echo "This is an example of a function"
}
count=1
while [ $count -le 3 ]
do
func1
count=$[ $count + 1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
[oracle@XAG143 myshell]$ ./test_fun1.sh
This is an example of a function
This is an example of a function
This is an example of a function
This is the end of the loop
This is an example of a function
Now this is the end of the script
2.函数返回值(默认退出状态码)
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。
在函数执行结束后,可以用标准变量$?来确定函数的退出状态码
$ cat test4.sh
#!/bin/bash
# testing the exit status of a function
func1() {
echo "trying to display a non-existent file"
ls -l badfile
}
echo "testing the function: "
func1
echo "The exit status is: $?"
$ ./test4.sh
testing the function:
trying to display a non-existent file
ls: badfile: No such file or directory
The exit status is: 1
#函数的退出状态码是1,这是因为函数中的最后一条命令没有成功运行。但你无法知道函数中其他命令中是否成功运行
使用函数的默认退出状态码是很危险的
3.函数返回值(使用 return 命令)
$ cat test5.sh
#!/bin/bash
# using the return command in a function
function dbl {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
dbl
echo "The new value is $?"
$ ./test5.sh
Enter a value: 2
doubling the value
The new value is 2
$ ./test5.sh
Enter a value: 200
doubling the value
The new value is 1
记住,函数一结束就取返回值;
记住,退出状态码必须是0~255。
要返回较大的整数值或者字符串值的话,你就不能用这种返回值的方法了
4.函数返回值(使用函数输出)
会用echo语句来显示计算的结果
$ cat test5b.sh
#!/bin/bash
# using the echo to return a value
function dbl {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"
$ ./test5b.sh
Enter a value: 200
The new value is 400
你会注意到dbl函数实际上输出了两条消息。read命令输出了一条简短的消息来向用户询问输入值。
bash shell脚本非常聪明,并不将其作为STDOUT输出的一部分,并且忽略掉它。
如果你用echo语句生成这条消息来向用户查询,那么它会与输出值一起被读进shell变量中。
5.向函数传递参数
函数名会在$0
变量中定义,函数命令行上的任何参数都会通过$1、$2等定义。也可以用特殊变量$#来判断传给函数的参数数目
[oracle@XAG143 myshell]$ cat test_fun6.sh
#!/bin/bash
# passing parameters to a function
function addem
{
if [ $# -eq 0 ] || [ $# -gt 2 ]; then
echo -1
elif [ $# -eq 1 ]; then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
echo -n "Adding 10 and 15: "
value=$(addem 10 15)
echo $value
echo -n "Let's try adding just one number: "
value=$(addem 10)
echo $value
echo -n "Now trying adding no numbers: "
value=$(addem)
echo $value
echo -n "Finally, try adding three numbers: "
value=$(addem 10 15 20)
echo $value
[oracle@XAG143 myshell]$ ./test_fun6.sh
Adding 10 and 15: 25
Let's try adding just one number: 20
Now trying adding no numbers: -1
Finally, try adding three numbers: -1
6.获取脚本在命令行中的参数值
[oracle@XAG143 myshell]$ cat test_fun7.sh
#!/bin/bash
# trying to access script parameters inside a function
function func7
{
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]; then
value=$(func7 $1 $2)
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi
[oracle@XAG143 myshell]$ ./test_fun7.sh 4 5
The result is 20
8.函数中局部变量
只要在变量声明的前面加上local关键字就可以了
[oracle@XAG143 myshell]$ cat test_fun8.sh
#!/bin/bash
# trying to access script parameters inside a function
function func7
{
local temp=$[ $1 * $2 ]
echo $[ $temp * 2 ]
}
if [ $# -eq 2 ]; then
value=$(func7 $1 $2)
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi
[oracle@XAG143 myshell]$ ./test_fun8.sh 4 5
The result is 40
9.向函数传数组参数
[oracle@XAG143 myshell]$ cat test_fun10.sh
#!/bin/bash
# array variable to function test
function testit
{
local newarray
#newarray=$1
# or
newarray=($(echo "$@"))
echo "The new array value is: ${newarray[*]}"
for var in ${newarray[@]}; do
echo "打印的内容@:" $var
done
for var2 in ${newarray[*]}; do
echo "打印的内容*:" $var2
done
}
myarray=(1 2 3)
echo "The original array is ${myarray[*]}"
testit "${myarray[*]}"
[oracle@XAG143 myshell]$ ./test_fun10.sh
The original array is 1 2 3
The new array value is: 1 2 3
打印的内容@: 1
打印的内容@: 2
打印的内容@: 3
打印的内容*: 1
打印的内容*: 2
打印的内容*: 3
方法2
[oracle@XAG143 myshell]$ cat test_fun10.sh
#!/bin/bash
# array variable to function test
function testit
{
local newarray
newarray=($(echo "$@"))
echo "The new array value is: ${newarray[*]}"
for var in ${newarray[@]}; do
echo "打印的内容@:" $var
done
for var2 in ${newarray[*]}; do
echo "打印的内容*:" $var2
done
}
myarray=(1 2 3)
echo "The original array is ${myarray[*]}"
#testit "${myarray[*]}"
# or
arg1=$(echo ${myarray[*]})
testit $arg1
[oracle@XAG143 myshell]$ ./test_fun10.sh
The original array is 1 2 3
The new array value is: 1 2 3
打印的内容@: 1
打印的内容@: 2
打印的内容@: 3
打印的内容*: 1
打印的内容*: 2
打印的内容*: 3
10.从函数返回数组
[oracle@XAG143 myshell]$ cat test_fun11.sh
#!/bin/bash
# returning an array value
function f_double
{
local origarray
local newarray
local elements
local i
origarray=($(echo "$@"))
newarray=($(echo "$@"))
elements=$[ $# - 1 ]
for (( i = 0; i <= $elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}
myarray=(1 2 3)
echo "The original array is: ${myarray[*]}"
arg1=$(echo ${myarray[*]})
result=($(f_double $arg1))
echo "The new array is: ${result[*]}"
[oracle@XAG143 myshell]$ ./test_fun11.sh
The original array is: 1 2 3
The new array is: 2 4 6
11.创建函數库
[oracle@DB02 myshell]$ cat myfuns.sh
# my script functions
function addem
{
echo $[ $1 + $2 ]
}
function multem
{
echo $[ $1 * $2 ]
}
[oracle@DB02 myshell]$ cat test_call_myfuns.sh
#!/bin/bash
# using functions defined in a library file
#. ./myfuns.sh
# or
source ./myfuns.sh
value1=10
value2=5
result1=$(addem $value1 $value2)
result2=$(multem $value1 $value2)
echo "The result of adding them is: $result1"
echo "The result of multiplying them is: $result2"
[oracle@DB02 myshell]$ chmod u+x test_call_myfuns.sh
[oracle@DB02 myshell]$ ./test_call_myfuns.sh
The result of adding them is: 15
The result of multiplying them is: 50
12.下载、安装、使用GNU shtool shell脚本函数库
[root@DB02 ~]# cd /usr/local/src
[root@DB02 src]# pwd
/usr/local/src
[root@DB02 src]# wget ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
[root@DB02 src]# ls
shtool-2.0.8.tar.gz
使用tar命令提取文件。
[root@DB02 src]# tar -zxvf shtool-2.0.8.tar.gz
[root@DB02 src]# ls
shtool-2.0.8 shtool-2.0.8.tar.gz
构建库
[root@DB02 src]# cd shtool-2.0.8
[root@DB02 shtool-2.0.8]# ./configure
[root@DB02 shtool-2.0.8]# make
使用make命令测试这个库文件
[root@DB02 shtool-2.0.8]# make test
Running test suite:
echo...........ok
mdate..........ok
table..........ok
prop...........ok
move...........ok
install........ok
mkdir..........ok
mkln...........ok
mkshadow.......ok
fixperm........ok
rotate.........ok
tarball........ok
subst..........ok
platform.......ok
arx............ok
slo............ok
scpp...........ok
version........ok
path...........ok
OK: passed: 19/19
安装,需要使用make命令的install选项。不过你得以root用户的身份运行该命令
[root@DB02 shtool-2.0.8]# make install
./shtool mkdir -f -p -m 755 /usr/local
./shtool mkdir -f -p -m 755 /usr/local/bin
./shtool mkdir -f -p -m 755 /usr/local/share/man/man1
...
./shtool install -c -m 644 sh.version /usr/local/share/shtool/sh.version
./shtool install -c -m 644 sh.path /usr/local/share/shtool/sh.path
shtool 库函数
shtool库提供了大量方便的、可用于shell脚本的函数。如下列出了库中可用的函数。
---------------------------------------------------
函 数 描 述
Arx 创建归档文件(包含一些扩展功能)
Echo 显示字符串,并提供了一些扩展构件
fixperm 改变目录树中的文件权限
install 安装脚本或文件
mdate 显示文件或目录的修改时间
mkdir 创建一个或更多目录
Mkln 使用相对路径创建链接
mkshadow 创建一棵阴影树
move 带有替换功能的文件移动
Path 处理程序路径
platform 显示平台标识
Prop 显示一个带有动画效果的进度条
rotate 转置日志文件
Scpp 共享的C预处理器
Slo 根据库的类别,分离链接器选项
Subst 使用sed的替换操作
Table 以表格的形式显示由字段分隔(field-separated)的数据
tarball 从文件和目录中创建tar文件
version 创建版本信息文件
--------------------------------------------------------
每个shtool函数都包含大量的选项和参数,你可以利用它们改变函数的工作方式。下面是shtool函数的使用格式:
shtool [options] [function [options] [args]]
13.使用库shtool
[oracle@DB02 myshell]$ cat test_shtool.sh
#!/bin/bash
shtool platform
[oracle@DB02 myshell]$ ./test_shtool.sh
centos 6.5 (AMD64)
查看幫助
[oracle@DB02 myshell]$ shtool -h
网友评论