shell学习之函数与库(一)

函数堪称shell的精华,有了函数和库,shell处理复杂问题也像编译语言那样有头有脸了,总之,shell的函数和库的重要性不言而喻。

1 函数的定义

建议使用

FUNC_NAME (){}的定义方法

有些人可能喜欢在前面加上function标记,这是bash独有的

function FUNC_NAME(){}

有点是简洁,容易识别是函数

2 函数返回值

一般可以用

①在函数中,return 返回

②调用函数,通过命令引用 比如 a=`func_name haha`

3 书上的一个小例子,计算1-6的二次方,三次方

[[email protected] shell]# cat square-cube.sh

#!/bin/bash

#

txt="_mktmp"

square_cube()

{

echo "$2 * $2"|bc > $1

echo "$2 * $2 * $2"|bc >> $1

}

for i in `seq 1 5`

do

square_cube $txt $i

square=`head -1 $txt`

cube=`tail -1 $txt`

echo "square of $i is $square"

echo "cube of $i is $cube"

done

rm -f $txt

执行结果:

[[email protected] shell]# ./square-cube.sh

square of 1 is 1

cube of 1 is 1

square of 2 is 4

cube of 2 is 8

square of 3 is 9

cube of 3 is 27

square of 4 is 16

cube of 4 is 64

square of 5 is 25

cube of 5 is 125

总结下:这里是一个很简单的函数调用,函数的功能就是处理办理计算结果保存在特定位置,主脚本负责控制流程

tips:1和l很相似,大家要注意,害的我浪费了时间

4 debugger脚本

[[email protected] shell]# cat debugger.sh

#!/bin/bash

#

#this a debugger by function

LOGFILE=/tmp/log.log

#指定脚本名

APPNAME=$0

#指定DEBUG级别,越高就显示越多的冗余信息

VERBOSE=10

#logmsg负责显示传递给它的消息

logmsg()

{

echo "$APPNAME:`date`[email protected]" >> $LOGFILE

}

#debug负责显示错误/调试 信息

debug()

{

verbosity=$1

#shift的目的在于把级别挪走,以便只显示debug信息

shift

if [ "$verbosity" -le "$VERBOSE" ] ;then

echo "$APPNAME:`date`---level:${verbosity}---:[email protected]" >> $LOGFILE

fi

}

#die函数你懂得

die(){

echo "$APPNAME:`date`----fatal [email protected]"

exit 1

}

#主脚本测试

#显示脚本开始,好像有点多余哈

logmsg now the log-checking system start -------

#测试uname -a命令是否存在

uname -a||die uname -a command not find.

#uname存在的话,继续执行

logmsg -----------system-info`uname -a`

#判断是redhat或者debian系统

cat /etc/redhat-release||debug 8 this is not a redhat system!

cat /etc/debian-release||debug 8 this is not a debian system!

#书上更多点,我这里省略了一些,为了简洁

运行结果

[[email protected] shell]# ./debugger.sh

Linux www.centos.vbird 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

CentOS release 6.4 (Final)

cat: /etc/debian-release: No such file or directory

总结下,这里三个函数互相协调使用,有撤销的,有报错的,注意[email protected]指全部参数,$0指文件名,$1指第一个参数,等,这些如果不知道的话得恶补啦

5 递归函数举例

典型a:计算阶乘

[[email protected] shell]# cat factorial.sh

#!/bin/bash

#

factorial(){

if [ "$1" -gt "1" ];then

previous=`expr $1 - 1`

parent=`factorial $previous`

result=`expr $1 \* $parent`

echo $result

else

echo 1

fi

}

factorial $1

执行结果:

[[email protected] shell]# sh -x factorial.sh 3

+ factorial 3

+ ‘[‘ 3 -gt 1 ‘]‘ ;;判断是否是1

++ expr 3 - 1

+ previous=2

++ factorial 2 ;;由于parent=`factorial $previous`在函数中调用了该函数,所以是递归

++ ‘[‘ 2 -gt 1 ‘]‘

+++ expr 2 - 1

++ previous=1

+++ factorial 1

+++ ‘[‘ 1 -gt 1 ‘]‘

+++ echo 1

++ parent=1 ;;最后知道初始条件为1的阶乘为1

+++ expr 2 ‘*‘ 1

++ result=2

++ echo 2

+ parent=2

++ expr 3 ‘*‘ 2

+ result=6

+ echo 6

6

可以算大的数,就是慢…

时间: 2024-12-04 21:14:47

shell学习之函数与库(一)的相关文章

shell学习总结之自定义函数

shell学习总结之自定义函数 Myfun (){ echo patams1 is $1 echo -n "now i is $i " ! [ "$i" ] && exit ; echo jj return '1' } myf=$(Myfun); echo myf Myfun 12 unset Myfun Myfun echo 'the end !'$myf 别人的 #! bin/bash # ----------------------------

shell 脚本学习笔记--函数

一.定义格式 [function] 函数名() { 命令表 } 二.调用方法 先定义,后使用,直接输入函数名,不需要圆括号() 三.函数参数传递方法 可以利用位置参数或者变量进行传递 #! /bin/bash# myfirst.sh testFunction() { echo "$1,$2" #位置参数传递参数 echo "$val1,$val2" #变量传递参数 } val1="test1" val2="test2" tes

shell学习三十一天----函数问题

函数 案例一: #!/bin/bash hello () { echo "hahahah" } hello 执行函数,结果为:hahaha 案例二: #!/bin/bash funWithReturn() { echo "the function is to get the sum of two number" read -p "input first number" num1 read -p "input second number&

Shell 学习21 - Shell 函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] } 如果你愿意,也可以在函数名前加上关键字 function: function function_name () { list of commands [ return value ] } 函数

[Bash Shell] Shell学习笔记

1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. 它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序.建立文件并以并行的方式协调各个程序的运行.因此,对于用户来说,s

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

[学习笔记] Python标准库的学习准备 [转]

Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了解基本的计算机各个组成部分的性能. 操作系统 在了解操作系统时,下面是重点: 1) 操作系统的进程管理,比如什么是UID, PID, daemon 2) 进程之间

Shell 语法之函数

函数是被赋予名称的脚本代码块,可以在代码的任意位置重用.每当需要在脚本中使用这样的代码块时,只需引用该代码块被赋予的函数名称. 创建函数 格式 function name { commands } name 属性定义了该函数的唯一名称.name 后面要有空格. name() { commands } 示例 #!/bin/bash# using a function in a script function func1 { echo "This is an example of a functio

第四章 shell学习之sed命令和awk编程

sed命令 sed只是对缓冲区中原始文件的副本进行编辑,不改变源文件,所以要保存则要重定向到另一个文件 sed三种方式: 1.sed [选项] 'sed命令' 输入文件 2.sed [选项] -f sed脚本文件 输入文件 3../sed脚本文件 输入文件 其中3的sed脚本文件要以#! bin/sed -f等开头 选项: -n 不打印所有行到标准输出,默认先打印匹配的再打印所有 -e 关联多个sed命令 -f 调用sed脚本文件 定位文本: x x为指定行号 x,y 从x到y行 /patter