shell脚本基础编程第四篇

本章主要内容:函数

函数

function:

function 名称 { 命令 ; } 或 name () { 命令 ; }

定义 shell 函数。

创建一个以 NAME 为名的 shell 函数。当作为一个简单的命令启用时,

NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令。当 NAME

被启用时,参数作为 $1...$n 被传递给函数,函数的名字储存在变量

$FUNCNAME 中。

函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程

与shell程序形式上是相似的,不同的是他不是一个单的进程,

不能独立运行,而是shell程序的 一 部分。

函数由两部分组成:函数名和函数体

语法:

function f_name {

...函数体..

}

语法:

f_name() {

...函数体...

}

函数的定义和使用:

可在交互式环境下定义函数

可将函数放在脚本文件中作为它的一部分

可放在只包含函数的单独文件中

调用:函数只有被调用才会执行

调用:给定的函数名

函数名出现的地方,会被自动替换为函数代码

函数的生命周期:被调用时创建返回时终止

函数返回值:

函数的执行结果返回值:

使用echo或printf命令进行输出

函数体中调用命令的输出结果

函数的退出状态码:

默认取决与函数中执行的最后一条命令的退出状态码

自定义退出状态码:

return            从函数中返回,用最后状态命令决定返回值

return 0         没有错误返回

return 1-255 有错误返回

==========================================================================

命令行举例,交互式环境下举例

[root@Compro ~]# function fun1(){ echo "xiaomag";}  在一行里面要加上;分号

[root@Compro ~]# fun1

xiaomag

定义函数名称为fun1,函数体为输出xiaomag;    然后直接输入fun1函数名,输出的内容为xiaomag

==========================================================================

shell脚本间简单举例

[root@Compro ~]# vim fun2.sh

#!/bin/bash

#

#user:Compro

#简单定义函数名称,函数体可以是命令,下面看下几个简单的命令

fun2(){                                                 这个算是在脚本中嵌入了函数

who

pwd                                              函数一般在文件的前面;调用文件的前面;

ifconfig                                         如果把下面的echo放在最前面,会导致不能调用这个函数;

ls

hostname                                     执行后会显示这几条命令的结果返回值

echo "执行函数fun2结果"          当所有函数执行结束后,显示打新输入一句话;也可以说是返回值

}

echo "执行函数fun2开始"                  在这个函数体执行的开始输出显示

fun2

echo "执行函数fun2结束"                  执行上面结果结束后最后显示

函数在使用前必须定义,因此应该将函数定义放在脚本的开始 ,

直到shel首次发现函数体后才能使用;调用函数体仅使用定义好的函数名就可以。

注意:在脚本里面定义的函数,不能在命令行下单独使用,因为不在一个shell进程,两边不想干

==========================================================================

set可以产看显示定义的变量。以及函数;

该定义的函数将一直保留到用户从系统退出,或执行了 unset fun1  取消函数定义

函数优先级:

别名

函数

内部

外部

使用函数文件:

可以将经常使用的函数存入函数文件,然后将函数文件载入shell中。

文件名可任意的选取,但是最好与相关任务有某种联系。

例如:functions.main

==========================================================================[root@Compro ~]# vim funs      创建函数文件

#/bin/bash

fun3(){                                           函数名

echo "xiaomag"                  函数体

}

funn4(){                                        函数名

edho "xiaomage"               函数体

}                                                    可以定义多个函数

==========================================================================

当函数文件定义好以后,需要加载到当前shell才能使用,就可以在命令行或脚本中调用函数,

可以使用set命令查看并检查所有定义的函数,

其输出列表包括已经载入shell的所有函数。

加载函数文件到当前shell:.  filename 或者 source filename

注意:.点 空格  文件名  这里的文件名要带正确路径

执行shell函数:

[root@Compro ~]# fun3

xiaomag

[root@Compro ~]# fun4

xiaomage

==========================================================================

若是要改动函数,首先用unset命令从shell中删除函数,改动完毕后,才重新载入此文件。

现在对函数做一些改动。首先删除函数,使其对shell不可用。使用unset命令完成此功能

命令格式为:unset 函数名称

[root@Compro ~]# unset fun4   这样shell中 set就没有个这函数了

==========================================================================

在shell脚本中调用函数文件中的函数

[root@Compro ~]# vim testfuns.sh    脚本

#/bin/bash

source funs        在脚本里面调用funs函数文件中的函数;如果函数文件要是跟这个脚本不在一个路径下,要写清楚路径

fun3               函数名

fun4               函数名

==========================================================================

函数参数:

传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可;

例如 fun1 变量1 变量2 ...

在函数体当中可使用$1 $2 ... 调用这些参数;还可以使用$@,$*,$# 等特殊变量

函数变量:

环境变量:当前shell和子shell有效

本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程,

因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数

局部变量:函数的生命周期;函数结束时变量自动销毁

注意:如果函数中有局部变量,如果其名称同本地变量,使用局部变量。

在函数中定义局部变量的方法:

local 变量名=变量值    函数内部有效。不加local是本地变量,加上是局部变量

函数递归:

函数直接或间接调用自身

注意递归层数

举例

fun (){echo fun;fun;}                               死循环,直到一定的程度会退出当前shell终端

fun () { let i++;echo $i;fun;}                   递增i循环。直到当前系统资源耗尽退出当前shell终端

10!=10*9!=10*9*8!=10*9*8*7!=...

n!=1*2*3....*n

(n-1)!=1*2*3....*(n-1)*n=n!

fun(

echo fun n-1 * n

)

==========================================================================

vim fact.sh

#/bin/bash

#

#user:Compro

fact(){    阶乘函数

if [ $1 -eq 0 -o $1 -eq 1 ];then调用 $1等于0    0的阶乘等于1   或者 $1等1  1的阶乘是1

echo 1如过给的数值是0或者是1就打印1

else如果给的不是0也不是0

echo "$[ $1*` fact $[$1-1]`]"$1*调用函数自己$1-1的值 它们的阶乘

fi

}

fact $1通过调用函数的值$1

==========================================================================

执行结果

[root@Compro ~]# bash fact.sh 1

1

[root@Compro ~]# bash fact.sh 2

2

[root@Compro ~]# bash fact.sh 3

6

[root@Compro ~]# bash fact.sh 4

24

[root@Compro ~]# bash -x fact.sh 4

+ fact 4

+ '[' 4 -eq 0 -o 4 -eq 1 ']'

++ fact 3

++ '[' 3 -eq 0 -o 3 -eq 1 ']'

+++ fact 2

+++ '[' 2 -eq 0 -o 2 -eq 1 ']'

++++ fact 1

++++ '[' 1 -eq 0 -o 1 -eq 1 ']'

++++ echo 1

+++ echo 2

++ echo 6

+ echo 24

24

·

linux 脚本编写 -eq,关于shell脚本基础编程第四篇相关推荐

  1. 在linux中编写shell脚本文件,如何编写简单的Shell脚本(Script)文件之Linux的基本操作...

    如何编写简单的Shell脚本(Script)文件之Linux的基本操作 新建一个文本文件包含所需要的脚本.举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网 ...

  2. Linux系统一键安全加固shell脚本编写思路

    本次分享一下个人在对Linux系统一键安全加固shell脚本编写时的一些思路: Linux系统一键安全加固shell脚本编写思路 1.编写须知 1.1 脚本使用说明 1.2 主要功能说明: 1.3隐藏 ...

  3. Linux 之旅 10:Shell 脚本

    Linux 之旅 10:Shell 脚本 (图片来自shell/bash脚本编程) Linux 上的 Shell 脚本可以看做是类似于Windows上的批处理程序(.bat)一样的东西,其本质就是将一 ...

  4. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  5. 刘启成_编写并使用shell脚本

    编写并使用shell脚本 实验环境: 为了集中查看linux服务器各方面的运行情况,管理员(root)希望定制自己的登录环境,以便自动显示监控信息.另外,通过编写简单的shell脚本,熟悉linux自 ...

  6. 标杆徐linux云计算视频,标杆徐2018 Linux自动化运维系列④: Shell脚本自动化编程实战...

    2019年录制SHell新课地址 贴切企业脚本编写思路讲解,带你玩Shell脚本编程实战. 本套课程从实际项目案例出发,近100个Shell实例讲解,由浅入深,循序渐进,带你玩转Shell编程的方方面 ...

  7. 如何在 Linux 中创建并运行 Shell 脚本(Bash 初学者教程)

    文章目录 1.创建并运行第一个 shell 脚本 2.将 shell 脚本转换为 bash 脚本 3.为什么大多数 shell 脚本都包含 #! /bin/bash 在 shell 脚本的开头? 4. ...

  8. vi新建一个shell脚本_编写第一个Shell脚本

    Linux中有好多中不同的shell,bash是linux默认的shell,免费且容易使用. su切换为root权限 1.创建shell脚本 touch hello.sh 2.编辑: vi hello ...

  9. idea写java_IDEA中编写并运行shell脚本的实现

    IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件,有友好的代码格式,支持自动补全,检查错误,并且配置完之后,还可以在IEDA中直接运行shell脚本.下面将一步一步演示插件 ...

最新文章

  1. 云答题微信小程序 实现 前端加后台管理
  2. RabbitMQ(四):RabbitMQ与Spring Boot简单整合 快速尝鲜版
  3. GOCN每日新闻(2017-08-12)
  4. 重工行业:IT运维精细化管理新篇章
  5. 智能车声标定位相关算法优化
  6. 使用 Spring Boot CLI 运行第一个Spring boot程序
  7. mongodb之配置
  8. 艾伟:ASP.NET跨页面传值技巧总结
  9. 在提交消息中链接到GitHub上的问题编号
  10. win10系统计算机如何分盘,win10新电脑怎么合理分盘?给win10电脑合理分盘的设置方法...
  11. LittlevGL在AliOS thing上的应用
  12. 加油站-问题详解(暴力-整体-贪心)
  13. 把 14 亿中国人都拉到一个微信群,程序员在技术上能实现吗?
  14. 《次第花开》学习笔记
  15. origin如何绘制双y轴曲线_如何在origin图中,做出双Y轴?
  16. Android版本新特性(6-12)(13预览)
  17. 计算机单片机考试作弊检讨书,关于大学生考试作弊检讨书1000字范文[共7页]
  18. Hyper-V虚拟化
  19. 衢州计算机网络技术,衢州广播电视大学计算机网络技术专业_浙江报名_网络教育计算机网络技术专业教学计划_中国教育在线...
  20. 基于瞬态自适应的麻雀搜索算法

热门文章

  1. 捷联惯导系统学习3.2(地球的正常重力场)
  2. 个人中心布局android,Android实现个人中心设置界面
  3. 重地坤 (易經大意 韓長庚)
  4. webstorm/idea license server
  5. 教育部高等教育司指定大学生必读100本书目
  6. mysql CPU占用过高解决方案
  7. Linux桌面i3与i7,i3吊打i7?——你所不知的CPU型号后缀的秘密
  8. DevOps工程师主要负责哪些事?需要具备哪些技能?
  9. 哈尔滨车牌摇号系统遭遇黑客攻击瘫痪
  10. DHCP:(2)思科交换机上部署DHCP服务以及DHCP中继功能