前言:接上回分析,关于shell脚本最后一节和拐友们讲一下最后的函数,因为shell函数经常会使用。

目录

一.Shell函数

1.1Shell函数的基本格式

1.2.Shell函数的案例

1.3.函数返回值

1.4函数的传参

1.5函数变量的作用范围

二.函数的参数

2.1参数的用法

2.2参数的表示方法

2.3参数的案例

2.3.1.求前一个数与后一个数相乘的结果

2.3.2求1到6的阶乘

2.4判断是否为文件

2.5递归函数

2.5.1递归显示var下的log里面有哪些是目录

2.5.2 交互式 递归方式计算你输入的数值作为阶乘

2.6小知识

三.Shell数组

3.1数组的定义

3.2数组的分类

3.3数组的定义方式

3.3.1.方法一

3.3.2.方法二

第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续

3.3.3.方法三

3.4元素分割

3.5元素替换和删除

3.6 删除数组​

四.冒泡排序

五.总结


一.Shell函数

1.1Shell函数的基本格式

第一种:

  1. [function] 函数名(){

  2. 命令序列

  3. [return x]                       #使用return或exit可以显示的结束函数

  4. }

第二种:

  1. 函数名() {                         #函数名后面()是没有内容的

  2. 命令序列                        #我们执行的命令内容放在{}里面

  3. }

1.2.Shell函数的案例

1.

2.

3.

1.f1 (){
2. echo hello
3.}
4.f3 (){
5. echo "$(f1) $(f2)"
6.}
7.
8.f2 (){
9.echo world
10.}
11.f3

4.

总结:

1.直接写函数中调用

2函数直接写函数名同名函数后一个生效

3.调用函数一定要先定义

4.只要先定义了调用的其他函数定义顺序无关

1.3.函数返回值

return表示退出函数并返回一个退出值,脚本中可以用 $ ? 变量显示该值

1.函数结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码

2.退出状态码必须是0~255,超出时值将为除以256取余

脚本格式:
1.#!/bin/bash
2.function test1 {
3.read -p "请输入一个数字:" num
4.return $[$num*2]
5.}
6.test17.echo $?

例子1:通过return返回一个乘积

例子2:

脚本格式:
1.#!/bin/bash
2.sum (){3.echo "第一个变量:" $1
4.echo "第二个变量:" $2
5.let n=$1+$2
6.echo $n
7.}
8.sum $2 $1   

1.4函数的传参

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。

1.#!/bin/bash
2.add () {
3.let sum=$1+$2
4.echo $sum
5.}
6.sum $1 $2

1.5函数变量的作用范围

1.函数在shell脚本中仅在当前shell环境中有效

2.Shell脚本中变量默认全局有效

3.将变量限定在函数内部使用local命令

3.1函数内部变量通过local来实现

3.2通过定义myfun函数,在其内部设置局部变量i

3.3函数内部和外部分别赋值,进行结果验证。

ps:

全局变量代表整体可以使用

局部变量代表的是全局变量里面可以使用其中一部分

1.#!/bin/bash
2.myfun(){
3.local i
4.i=65.echo $i
6.}
7.i=88.myfun
9.echo $i

二.函数的参数

2.1参数的用法

函数名称:参数1,参数2,参数3

2.2参数的表示方法

$1 $2 $3.........${10}${11}

2.3参数的案例

2.3.1.求前一个数与后一个数相乘的结果

脚本格式:
1.#!/bin/bash
2.jiecheng (){
3.hehe=1
4.for i in {1..6}
5.do
6.let hehe=$i*$hehe
7.echo $hehe
8.done
9.}
10.jiecheng

2.3.2求1到6的阶乘

脚本格式:
1.#!/bin/bash
2.#求阶乘1到6的阶乘
3.jiecheng (){
4.hehe=1
5.for i in {1..6}
6.do
7.let hehe=$i*$hehe
8.done
9.echo $hehe}
11.jiecheng

2.4判断是否为文件

#!/bin/bash
file=/home/hehe.txt
hehe(){
if [ -f $file ];then  #判断是否为文件return 80
elsereturn 40
fi}
hehe
echo $?

2.5递归函数

2.5.1递归显示var下的log里面有哪些是目录

[root@localhost ~]# vim digui.sh
#!/bin/bash
#列出目录文件的列表,目录可用颜色表示(蓝色表示目录;白色表示文件)文件显示层及关系
list (){
for i in $1/*  #$1下面的所有内容doif [ -d $i ];then   #-d代表是目录 只要是目录的我就用蓝色显示echo -e "\e[34m$i\e[0m"
#标准格式【】里面的内容是表示颜色  -e表示转义字符标识echo $ilist $i " $2"elseecho "$2$i"fi
done
}
list $1 $2 #调用变量

2.5.2 交互式 递归方式计算你输入的数值作为阶乘

#!/bin/bash
#交互式 递归方式计算你输入的数值作为阶乘
#比如我第一次输入5
fun (){
if [ $1 -eq 1 ];thenecho 1
else
#5不等于1执行else的 此时tp=5-1=4;res=4 此时echo为5*4local tp=$[ $1 - 1 ]  #这个是局部  res=$(fun $tp)  #相当于直接调用tp本身echo $[ $1 * $res ] #$1是5
fi
}read -p "请输入:" num
res=$(fun $num)
echo $res#执行过程
#fun 5 $1=5 tp=4 res=fun 4 echo 5 * 4()      5*4*3*2*1
#fun 4 $1=4 tp=3 res=fun 3 echo 4 *3(fun)    4*3*2*1
#fun 3 $1=3 tp=2 res=fun 2 echo 3 * 2(fun)   3*2*1
#fun 2 $1=2 tp=1 res=fun 1 echo 2*1(fun)     2*1
#fun 1 $1  echo 1                            1

方法一:

方法二:(递归方式)

2.6小知识

给命令行提示字符加颜色
PS1="\[\e[1;34m\][\u@\h \W]\\$\[\e[0m\] "PS1="\[\e[1;35m\][\[\e[1;34m\]\u\[\e[1;36m\]@\[\e[1;34m\]\h \[\e[1;31m\]\w\[\e[1;35m\]]\[\e[1;36m\]\\$\[\e[0m\] "\[\e[1;35m\][ ====> 定义左边的"["
\[\e[1;34m\]\u ====> 定义用户名
\[\e[1;36m\]@ ====> 定义"@"
\[\e[1;34m\]\h ====> 定义第一个点(.)之前的主机名 //34代表文件
\[\e[1;31m]\w ====> 定义目录完整路径
\[\e[1;35m]] ====> 定义"]"
\[\e[1;36m\]\\$ ====> 定义"#"或"$"
\[\e[0m\] ====> 一段不显示字串的结束

三.Shell数组

3.1数组的定义

数组的存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用

3.2数组的分类

1.普通数组:不需要声明直接定义,下标索引只能是整数

2.关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串

3.3数组的定义方式

3.3.1.方法一

第一种:直接把要加入数组的元素用小括号括起来,中间空格分开

定义:num=(11 22 33 44)${#num}显示字符串长度数组名=(value0 value1 value2)

3.3.2.方法二

第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续

1.num=([0]=11 [1]=33 [2]=44 [3]=66)

3.3.3.方法三

第三种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

list=“11 12 13 14”
num=($list)

3.4元素分割

3.5元素替换和删除

3.6 删除数组

四.冒泡排序

数组排序算法:冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

冒泡排序的思路以及定义:

相邻两个数之间进行比较,每次比较1.数组长度-1

2.得出每次数组长度后

3.最后一个值,确定为本

4.次比较后的最大值了

score=(77 13 91 56 88)
------------第一轮------------
77 13 91 56 88 第一次对比 数组长度-1 第一轮比较往后值, 最好以为最大值91
13 77 91 56 88 第二次对比
13 77 91 56 88 第三次对比
13 77 56 91 88 第四次对比
13 77 56 88 91
------------第二轮------------
13 77 56 88 91 第一次对比 数组长度-1第二轮比较往后,第二大的数字88
13 77 56 88 91 第二次对比
13 56 77 88 91 第三次对比
13 56 77 88 91
------------第三轮-----------
13 56 77 88 91 第一次对比 数组长度-1第三轮比较往后,第三大的数字77
13 56 77 88 91 第二次对比
13 56 77 88 91
------------第四轮-----------
13 56 77 88 91 第一次对比 数组长度-1第四轮比较往后,第四大的数字56
13 56 77 88 91

为什么每次比较都要-1?

减一是因为每次我对比完成之后,都会确定一个本轮比较的最大值,下次就不需要在比较了

#!/bin/bash
array=(90 70 80 100 30 66)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定义比较轮数,比较轮数为数组长度减1,从1开始
for ((i=1;i<$lt;i++))
do#确定比较元素的位置,比较相邻两个元素,较大的数往后面放,在比较次数轮数而减少for((j=0;j<$lt-i;j++))do#定义第一个元素的值first=${array[$j]} #定义第二个元素的值k=$[$j+1]second=${array[$k]}#如果第一个元素比第二个元素大就会互换 if [ $first -gt $second ];then#把第一个元素值保存到临时变量中temp=$first#把第二个元素的值赋给第一个元素array[$j]=$second#把临时的变量赋给第二个元素     array[$k]=$tempfi done
done
echo "new_array:${array[@]}"

五.总结

1.for语句的结构

2.while语句的结构

3.until语句的结构

4.Shell函数定义方法

5.数组使用方法

Shell脚本之函数相关推荐

  1. Shell脚本中函数返回值的用法笔记

    函数的返回值又可以称为函数的退出状态,实际上可以理解为一种通信方式.Shell脚本中函数可以使用返回值的方式把调用的结果信息反馈给调用者.便于调用者可以根据反馈的结果做相应处理. 说明:函数的返回值主 ...

  2. Linux系统shell脚本之函数的使用

    Linux系统shell脚本之函数的使用 一.函数解释 二.函数参数 1.参数注意事项 2.特殊参数说明 三.函数实例1 四.函数实例2 一.函数解释 1.函数(function)作用:函数可以在sh ...

  3. Shell脚本中函数的定义和调用笔记

    Shell脚本函数的作用主要是把一些可以通用的功能封装起来.避免脚本中出现大量重复的脚本代码,同时可以大大增强脚本的可读性.和可维护性. Shell函数定义的语法格式: function FUNCTI ...

  4. shell脚本之函数篇

    话不多说,直接上格式: linux shell中的函数格式: function Myfunc(){ action; [return int;] } 其中,个人认为function和()都是函数的标志, ...

  5. #9 shell脚本的函数运用

    systemV风格的服务管理脚本: 给脚本传递一些参数:start, stop, restart, status myservice.sh #!/bin/bash # lockfile="/ ...

  6. shell脚本(function函数)

    function函数 1. 函数function的作用 2. 函数的定义 3. 函数参数 4. 在函数里用本地变量 1. 函数function的作用 函数function是由若干条shell命令组成的 ...

  7. Shell脚本(函数,shell中的数组)

    函数 函数就是把一段代码整理到一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式:function f_name(){ command } 函数必须放在最前面 ...

  8. Shell脚本中函数位置参数的用法笔记

    位置参数主要是用于调用函数的时候有时候需要传递参数,有很大的比例都是需要调用函数的时候动态传递参数,从而实现相应的功能.比如我想要计算两个数的和,可以通过函数是实现,需要定义两个参数作为计算的值.这样 ...

  9. shell脚本获取函数返回值

    方式1 原理:return返回的值可以通过$?得到. 缺点:return只能返回整数 #!/bin/sh function test() {return 100 } test echo $? 方式2 ...

最新文章

  1. linux 系统调用 read,write和lseek 使用
  2. 摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释
  3. 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类
  4. Typescript中class的extends码源分析
  5. 在SQL Server2005中进行错误捕捉
  6. vs2008 调试时不会命中断点,源代码与原始版本不同,解决办法
  7. 深入探讨JavaScript函数
  8. 浮动Float(HTML、CSS)
  9. oracle静态,oracle静态sql和动态sql
  10. 常见sql注入语句和xss注入语句
  11. 吉大计算机学院奖学金的分配,奖励资助_吉林大学奖学金设置_高考院校库
  12. html流特性,CSS深入理解流体特性和BFC特性下多栏自适应布局_html/css_WEB-ITnose
  13. mysql开启远程登录
  14. java梯形面积代码_Java面向对象练习题之梯形面积
  15. 关于Employee 类的使用
  16. C# 读取Word中的脚注和尾注内容
  17. mysql 初始化my.cnf_my.cnf初始化配置
  18. 对象、对象的属性、对象字面量、枚举对象中的属性、可变类型、变量和对象——JS对象
  19. 使用ADB命令卸载安卓设备上的应用
  20. Java中基本数据类型和引用数据类型存放的位置(栈内存和堆内存)

热门文章

  1. 区块链蕴含的变革力量
  2. yaml语法格式,springboot中yaml的使用
  3. 我花了十八年时间才能和你坐在一起喝咖啡
  4. 银河麒麟服务器系统ip可ping通,但是tongweb的默认端口9060、8088不能访问,访问提示404
  5. 从android恢复到iphone,iPhone换到安卓机有多难适应?看看是怎么恢复过来的!
  6. 云盘存储 教学反思_疫情时期,如何打造一堂高效在线直播课(附3套实用工具包)...
  7. 计算机课上最难忘的一幕
  8. 基于Predictive Parsing的ABNF语法分析器(十二)——alternation、concatenation、group和option
  9. make与makefile
  10. C语言·sqrt()的用法