设为首页 收藏本站
查看: 1188|回复: 0

Bash脚本编程(四)之Shell函数

[复制链接]

尚未签到

发表于 2015-10-25 14:52:24 | 显示全部楼层 |阅读模式
  淘品牌 DM杂志


DSC0000.jpg
清仓特价 韩版 李孝利 欧美復古罗马斗士 凉鞋 高跟鞋 实拍
58.0元
DSC0001.gif
BashShell函数是一种能把若干UNIX/LINUX命令打包执行的方法,在执行时一个简单的名字就能够代替这些命令。执行函数就像执行普通的UNIX命令一样简单。Bash会在当前上下文的环境中执行Shell函数,而不再产生新的进程去解释函数。
Bash alias别名和函数都能帮你为长或复杂的命令定义快捷方式。但是,alias别名不允许控制流,参数,以及其他有技巧的事情。而这些事情,函数都能做到。我们将会在下面讲解。
这篇文章是我们正在进行的Bash脚本编程系列的一部分。你可以查看前三篇文章:Bash脚本编程简介,Bash的退出状态,以及Bash alias别名。
定义一个Bash函数的语法如下:
function functionname()
{
commands
.
.
}
--- function是一个可选的关键字
--- functionname是函数的名字
--- commands 表示在函数中执行的命令。

  
$ functionname arg1 arg2
--- shell解释一个linux命令时,会先查找特殊的内建函数,像break, continue, eval, exec等函数。然后,Shell才会查找自定义函数。
--- 函数的退出状态也就是在函数体内最后一个命令的退出状态。
注:把Shell函数的定义放在一个Shell的启动文件中。这样,在命令行中你总能找到这个函数。你可以参考我们早些时候的文章Bash的启动顺序,以确定.bash_profile何时会被启动。

1:一个显示指定后缀名文件的长列表的函数
函数“lsext”可以查找当前目录下的指定后缀名的文件。函数体内使用了findls命令。
$ function lsext()
{
find . -type f -iname '*.'${1}'' -exec ls -l {} /; ;
}
$ cd ~
$ lsext txt
-rw-r--r-- 1 root root   24 Dec 15 14:00 InMorning.txt
-rw-r--r-- 1 root root  184 Dec 16 11:45 Changes16.txt
-rw-r--r-- 1 root root  458 Dec 18 11:04 Changes18.txt
-rw-r--r-- 1 root root 1821 Feb  4 15:01 ChangesOfDB.txt
  
2:一个能够对一组文件执行指定命令的函数
下面的例子中,函数“batchexec”先找到指定后缀名的文件,再对这些文件执行指定的命令。
$ function batchexec()
{
find . -type f -iname '*.'${1}'' -exec ${@:2}  {} /; ;
}
$ cd ~
$ batchexec sh ls
$ batchexec sh chmod 755
$ ls -l *.sh
-rwxr-xr-x 1 root root  144 Mar  9 14:39 debug.sh
-rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh
-rwxr-xr-x 1 root root   22 Mar 18 08:32 t.sh

    在上面的例子中,函数找到所有以.sh为后缀名的脚本,并且把脚本的权限修改为755。在函数体内,${@:2}表示第二个以及接下来的位置参数。
  



3:能够生成随机密码的函数
下面的函数能够根据特定的字符生成给定长度的高强度随机密码。如果长度未被指定,那么默认生成12字符长的密码。
  
     $ function rpass() {
cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12}
}
$ rpass 6
-Ju.T[[
$ rpass
Gz1f!aKN^""k

在上面的例子中,当rpass的参数为6时,函数生成字符串长度为6的随机密码。当rpass无参数时,那么函数生成12字符长度的密码。${1:-12}表示如果$1未定义或空时,12被返回,否则$1被返回。
  
4:返回给定接口的IP地址的函数
下面的例子定义了一个函数“getip”以接口为参数,返回该接口的IP地址(默认返回接口ETH0IP地址)。函数体内使用了ifconfig命令。


  $ function getip()
{
/sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}';
}
$ getip
15.110.106.86
$ getip eth0
15.110.106.86
$ getip lo
127.0.0.1

  

5:打印机器信息的函数
此例定义了一个能够显示机器所有需要信息的函数。用户可以在启动文件中定义并调用该函数,以便于在启动时得到这些信息。
$ function mach()
{
echo -e "/nMachine information:" ; uname -a
echo -e "/nUsers logged on:" ; w -h
echo -e "/nCurrent date :" ; date
echo -e "/nMachine status :" ; uptime
echo -e "/nMemory status :" ; free
echo -e "/nFilesystem status :"; df -h
}
$ mach
Machine information:
Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux
Users logged on:
root     pts/2    ptal.mot Wed10    0.00s  1.35s  0.01s w -h
Current date :
Thu Mar 18 11:59:36 CET 2010
Machine status :
11:59:36 up 7 days, 3 min,  1 user,  load average: 0.01, 0.15, 0.15
Memory status :
total       used       free     shared    buffers     cached
Mem:       2059768    2033212      26556          0      81912     797560
-/+ buffers/cache:    1153740     906028
Swap:      4192956      48164    4144792
Filesystem status :
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              12G   12G     0 100% /
tmpfs                1006M  377M  629M  38% /dev/shm
/dev/sdc5             9.9G  409M  9.0G   5% /mydisk

6:格式化ls命令输出
函数首先清屏,然后将光标置于屏幕顶端,接着执行ls命令,最后再把光标置于屏幕底部。
$ function ll ()
{
clear;
tput cup 0 0;
ls --color=auto -F --color=always -lhFrt;
tput cup 40 0;
}
$ ll

使用type命令返回函数类别
Type是一个内建函数,可以返回函数类别。

Syntax:
type function-name
$ type ll
ll is a function
ll ()
{
clear;
tput cup 0 0;
ls --color=auto -F --color=always -lhFrt;
tput cup 40 0;
alias ls="ls --color=auto -F"
}

为了让你更方便的参考,你在这里得到上面的6个函数。
将这些函数放在你的~/.bash_profile文件中,这样就可以保证一直能够使用这些函数。


函数能够接受参数。在执行过程中,函数的参数会被赋值给Bash的特殊变量:位置参数。参数$0代表脚本的名字,是不能被改变的的。
在命令行中,你能像下面这样调用一个函数。
  



清仓特价 韩版 李孝利 欧美復古罗马斗士 凉鞋 高跟鞋 实拍
58.0元
  淘品牌 DM杂志

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130683-1-1.html 上篇帖子: shell程序设计 下篇帖子: 执行shell脚本进入指定目录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表