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

淘品牌 DM杂志

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

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杂志

你可能感兴趣的:(Bash脚本编程)