1 shell的库
perl或c等语言中都有功能库。提供一些功能的集合,而shell中通过脚本的源引用,达到相同的作用。一般也是建议在设计的脚本程序文件夹下lib/ 存放相应的库文件,这些文件内写有常用的功能函数,方便调用。
2 库的创建和访问
库的创建和脚本类似,也就是你看的的库通常就是一堆接受变量的函数,而需要的时候只需要 . /PATH/TO/LIB或者source 即可。bash首先会找$PATH目录中是否有库,然后找本目录下。
3 一个简单的库调用
[root@www ~]# cat lib1
mul(){
echo -n "$1x$2的值是"
echo "$1 * $2"|bc
}
运行结果为
[root@www ~]# cat calling.sh
#!/bin/bash
#
#调用lib1库
. ./lib1
#使用lib1的乘法
mulresult=`mul 1 5`
echo "乘法的结果为$mulresult"
运行结果为:
[root@www ~]# ./calling.sh
乘法的结果为1x5的值是5
4 下面介绍下书上的关于了解网络信息的脚本
①definitions.sh负责定义一些基本的变量
②network.sh负责定义查看网络信息的总过程
③redhat-network.sh负责关于redhat network的具体操作
④debian-network.sh负责关于debian系列关于网络的操作
⑤solaris-network.sh负责关于solaris系统的网络操作
关于definitions.sh
#define the error info
_WRONG_PLATFORM=1
_NO_IP=2
_NO_CONFIG=3
_SUCCESS=0
关于network.sh
#!/bin/bash
#读取配置文件
[ -z $_definitions ] &&. ./definitions.sh
[ -f /etc/redhat-release ]&& . ./redhat-network.sh
[ -f /etc/debian.release ]&&. ./debian-network.sh
[ `uname` == "SunOS" ]&&. ./solaris-network.sh
#读取网卡名称
for nic in $*
do
#核心调用:通过网卡名称获得ip地址
nicinfo=`getipaddr $nic`
case $? in
$_NO_IP)echo "info----$nic has no ip.";;
$_NO_CONFIG)echo "info----$nic has no config.";;
$_WRONG_PLATFORM)echo "info----wrong platform";;
$_SUCCESS)echo "info----$nic has ip $nicinfo";;
esac
done
关于redhat-network.sh
#specific method on redhat
[ -z $_definitions ]&& . ./definitions.sh
getipaddr(){
if [ -d /etc/sysconfig/network-scripts ];then
if [ -f /etc/sysconfig/network-scripts/ifcfg-$1 ];then
unset IPADDR
. /etc/sysconfig/network-scripts/ifcfg-$1
[ -z $IPADDR ] && return $_NO_IP|| {echo $IPADDR;return $_SUCCESS}
else
return _$NO_CONFIG
fi
else
return $_WRONG_PLATFORM
fi
}
关于debian-network.sh
先放张ubuntu配置的图片看看
#specific method on debian
[ -z $_definitions ]&&. ./definitions.sh
getipaddr(){
[ -f /etc/network/interfaces ]||return $_NO_CONFIG
#设立标志位初始为0
found=0
#按行读取,分别赋值给keyword,argument,morestuff变量
while read keyword argument morestuffs
do
#最终读到了带有首位iface的行
if [ "$keyword" == "iface" ];then
if [ "$found" eq "1" ];then
#很巧妙,此时found值为1说明找到了这张网卡,只是找不到address的行,如果找到,那么就在下一个if返回了
return $_NO_IP
else
#第一次执行该内容
if [ "$argument" == "$1" ];then
#找到这个网卡
found=1
fi
fi
fi
if [ "$found" eq "1" ];then
if [ "$keyword" == "addresss" ];then
echo $argument
return $_SUCCESS
fi
fi
done </etc/network/interfaces
if [ "$found" eq "0" ];then
return $_NO_CONFIG
fi
关于solaris-network.sh
#solaris不了解
[ -z "$_definitions" ] &&. ./definitions.sh
#special method on solaris
getipaddr(){
uname | grep SunOS>/dev/null &&return $_WRONG_PLATFORM
[ -f /etc/hostname.${1} ] ||return $_NO_CONFIG
[ ! s /etc/hostname.$1 ] && return $_NO_IP
getent hosts ` head -1 /etc/hostname.${1} | cut d"/" f1| awk '{print $1}'` |cut f1||cat /etc/hostname.${1}
return $_SUCCESS
}
分析下各个脚本:就像程序开发一样,具体系统的操作系统如果有脚本处理,那么调用同名函数返回值相似就会让程序运行很方便,不必考虑具体细节
最终程序的运行结果为
[root@www shell]# ./network.sh eth0 eth1 lo
info----eth0 has no ip.
info----eth1 has ip 192.168.177.130
info----lo has ip 127.0.0.1
缺陷是对于dhcp无法,其实可以修改下,只要增加判断$BOOTPROTO是否为dhcp(建议统一tr转换大小写),是则返回dhcpstyle即可
[root@www shell]# ./network.sh eth0 eth1 lo
info--eth0 has dhcp style
info----eth1 has ip 192.168.177.130
info----lo has ip 127.0.0.1
5介绍下getopts的使用
①getopts
通过名字就知道是获取选项参数,写脚本必然用处极大,一般用于循环中
getopts比较重要的几个参数
optstring option字符串,会逐个匹配
varname 每次匹配成功的选项
arg 参数列表,没写时它会取命令行参数列表
$OPTIND 特殊变量,option index,会逐个递增, 初始值为1,表示第几个参数
$OPTARG 特殊变量,option argument,不同情况下有不同的值
getopts option variable
通常我们的命令行模式ps -e
1 getopts首先会找连字符-,找到后,就把连字符后面内容和option(一般为单个字符)比较,如果不一样,会错误返回;
如果一样,则把variable赋值为那个选项。所以此时variable为e
getopts option:
当我们输入ls l /etc
2如果选项后面还有参数,在getopts中需要加:才行,那么就把参数后面的值赋给$OPTARG,所以此时OPTARG为/etc,如果加了冒号,却没有参数,那么$OPTARG会被赋值为一个?,且getopts会返回错误信息。
getopts :option:
3 此时,如果匹配到option,而如果option满足,比如-h,那么由于第一个是:,相当于空,所以$OPTARG为选项h,这样方便自定义错误返回。
②程序实例
1 获得选项和参数
[root@www shell]# cat getopt1.sh
#!/bin/bash
#
#get option_string variable
while getopts 'a:q' argv
do
case $argv in
a) echo "you entered $argv and $OPTARG
next index is $OPTIND";;
q) echo "exiting";exit 2;;
esac
done
运行结果
[root@www shell]# ./getopt1.sh -a haha
you entered a and haha
next index is 3
2 通过选项获得提示信息
[root@www shell]# cat getopt2.sh
#!/bin/bash
#
#get option_string variable
while getopts ':a:q' option
do
case $option in
a) echo "you \$OPTARG is $OPTARG
next index is $OPTIND
and the variable is $option";;
q) echo "exiting";exit 2;;
":")
case $OPTARG in
a)echo "please input -a your string ";;
esac
esac
done运行结果为
[root@www shell]# ./getopt2.sh -a
please input -a your string
这位博主写的很好http://blog.163.com/leekwen@126/blog/static/3316622920101543555483/ 记录下