SHELL脚本编程进阶(二)
写在前面(最重要)
前言
函数和数组
第一部分 函数函数定义
#语法一: functionfun_name{ ...函数体... } #语法二: functionfun_name(){ ...函数体... } #语法三:fun_name(){ ...函数体... } 实际使用过程中, 三种方式没有什么区别,根据自己的喜好去使用就可以。 函数使用
#!/bin/bash # #函数定义 hello(){ echo"HelloWorld!" } #函数调用 hello
#单独定义一个函数文件 #执行vim/app/funcs #函数定义hello(){ echo"HelloWorld!" } #函数调用 hello
#!/bin/bash #引用函数文件 ./app/funcs #调用函数名称 hello 函数返回值
#!/bin/bash # #定义一个能够返回字符串的函数 hello_echo(){ echo"Hello" } #定义一个返回命令执行结果的函数 hello_return(){ ls/etc/*&>/dev/null return } #定义一个自定义状态结果的函数 hello_return_error(){ echo"test"&>/dev/null return1 } #调用函数的返回结果 echo"result1is$(hello_echo)" #调用函数的结果状态值 hello_return echo"result2is$?" #调用函数的结果状态值 hello_return_error echo"result3is$?" 函数参数
#!/bin/bash#hello(){ echo"参数的个数是$#" echo"输出所有的参数$@" echo"输出所有的参数$*" echo"第一个参数是$1" forargin$@;do echo"$arg" done } #调用函数,并在调用的时候传入参数。 hellopythonjavac#
[root@localhostfunction]#./f4.sh参数的个数是3 输出所有的参数pythonjavac# 输出所有的参数pythonjavac# 第一个参数是python python java c# 函数变量
#!/bin/bash # hello(){ #定义一个函数体内的局部变量 localname="HelloBash" echo$name } echo$name #没有值因为脚本中并没有定义这样一个本地变量 hello #会输出HelloBash 函数的递归调用
实验一 实现斐波那契数列
#!/bin/bash##实现了斐波那契数列read-p"请输入阶数"N fibonacci(){ if(($1==0));then echo0 elif(($1==1));then echo1 else #echo$(($[fibonacci$[$1-1]]+$[fibonacci$[$1-2]])) letnum=$(fibonacci$[$1-1])+$(fibonacci$[$1-2]) echo$num fi } if[$N-ge0]&>/dev/null;then forIin`seq0$N`;do fibonacci$I done else echo"$N不是数字或者$N小于0" exit fi 实验二 实现汉诺塔
#!/bin/bash read-p"pleaseinputthenumberofplates:"NUM #执行的步骤数 STEPS=0 move(){ letSTEPS++ echo"$STEPS:moveplate$1$2---------->$3" } #传入的参数NUMABC hanoi(){ if[$1-eq1];then move1$2$4 else hanoi$[$1-1]$2$4$3 move$1$2$4 hanoi$[$1-1]$3$2$4 fi } hanoi$NUMABC 实验三 fork炸弹
#在bash命令提示符后输入以下内容,系统很快就会崩溃。 :(){:|:&};: #下面这段代码是fork炸弹地形象展示。 bomb(){bomb|bomb&};bomb
<html> <body> <script> vartotal=""; for(vari=0;i<1000000;i++) { total=total+i.toString(); history.pushState(0,total); } </script> </body> </html> 第二部分 数组
数组声明与赋值
注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持,这就是关联数组,有点类似于高级编程语言中的字典 数组引用
数组的数据处理
实验一 实现矩阵转置 #编写脚本实现矩阵转置matrix.sh # 123 147 # 456 ==>> 258 # 789 369 #!/bin/bash declare-Amatrix num_rows=3 num_columns=3 matrix=([1,1]="1"[1,2]="2"[1,3]="3"[2,1]="4"[2,2]="5"[2,3]="6"[3,1]="7"[3,2]="8"[3,3]="9") f1="%9s" for((i=1;i<=num_rows;i++))do for((j=1;j<=num_columns;j++))do printf"$f1"${matrix[$i,$j]} done echo done echo echo for((j=1;j<=num_columns;j++))do for((i=1;i<=num_rows;i++))do printf"$f1"${matrix[$i,$j]} done echo done
实验二 编写脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;要统计其下标为偶数的文件中的行数之和 #!/bin/bash # #bash中数组支持直接使用通配符来进行赋值 declare-afiles=(/var/log/*.log) declare-ilines=0 foriin$(seq0$[${#files[*]}-1]);do #判断下标是不是偶数 if[$[$i%2]-eq0];then letlines+=$(wc-l${files[$i]}|cut-d''-f1) fi done echo"Lines:$lines" 迄今为止,bash编程的大部分知识都已经介绍的差不多了,但是介绍的内容比较浅显,并没有深入的介绍。同时bash编程由于具有巨大的灵活性,导致使用方式多种多样,实际生产中应该根据自己的实际情况来灵活使用。 个人博客地址:http://www.pojun.tech/欢迎访问 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |