1.函数格式

  • 目的:将一些相对对立的代码变成函数,提供可读性和重用性,避免重复编写相同代码。
  • 函数格式:
    • 函数关键字:function可以省略,可不带任何参数;
    • 符号{表示函数体的开始(可在函数名后单独一行),符号}表示函数体结束;
    • 函数返回值:
      • 显式返回:加return,return后面接数值n(0~255);
      • 隐式返回:最后一个命令的运行结果;
    [function] 函数名 [(参数列表)] {commands;[return int;]
    }
    

2.函数调用

  • 调用函数名:所有函数必须在使用前预先定义好,即函数放在脚本文件的开始位置,调用函数时仅使用函数名即可

    #! /bin/bashfoo () {echo "This is foo"return 0
    }foo  # 调用函数foo()
    

3.shell中的函数参数

  • 在shell中,调用函数时可以向函数传递参数。在函数内部取参数时,通过特殊变量$n的形式来获取参数的值。例如:$1表示第1个参数,$2表示第2个参数,…,$100表示第100个参数。函数调用时,通过命令行参数的形式来传递参数。

    [cdl@h3c/home/cdl/Test]$cat demo.sh
    #!/bin/bash:<<commentecho "这是shell脚本中整段代码注释的方法,不需要逐行用#进行注释"commentprintFunParams() {echo "当前文件名称: $0"echo "命令行参数中的第1个参数: $1"echo "命令行参数中的第2个参数: $2"echo "传递给脚本或函数的所有参数: $@"echo "传递给脚本或函数的所有参数: $*"echo "传递给脚本或函数的所有参数总数: $#"
    }# 调用带参数的函数
    printFunParams A B C D
    [cdl@h3c/home/cdl/Test]$./demo.sh
    当前文件名称: ./demo.sh
    命令行参数中的第1个参数: A
    命令行参数中的第2个参数: B
    传递给脚本或函数的所有参数: A B C D
    传递给脚本或函数的所有参数: A B C D
    传递给脚本或函数的所有参数总数: 4
    

4.shell编程规范

  • 脚本文件名称以.sh结尾,尽量使用UTF-8文件编码;
  • 脚本文件首行使用#!/bin/bash,没有空格,不带任何选项;
  • 程序头注释:脚本功能、作者、修改时间等;
  • 全局变量定义在程序头注释后空一行开始位置,尽量大写;
  • 变量的引用使用${var},不推荐使用$var;
  • 单引号(推荐常量)、双引号(推荐变量)、不用引号(推荐数字);
  • 数值运算let和(())中的变量不要加$、expr中加$;
  • 成对符号尽量一次性写完,防止遗漏,如:{}、[]、"";
  • []或[[]]两端有空格;
  • 命令替换,推荐${cmd}形式,不推荐`cmd`格式;
  • 脚本代码缩进没有强制要求,要么统一用空格或TAB键;
  • 关键操作给一个执行结果状态,执行失败时exit N(前一个命令执行状态结果,使用$?来检查);
  • 关键操作需要日志记录,记录操作的成功、失败及操作时间;
  • 可以使用&&、|| 代替简单的if-then-else-fi语句;
  • 命令过长时使用符合\来延长,有管道的命令时除外;
  • 尽量使用函数功能,将不同功能定义为不同函数,直接调用函数;
  • 文件名全部小写命名,禁止使用rm -rf *
  • 分离复合命令(if分支结构、for/while循环),尽量使用如下方式:
    if [ 条件 ]; then......
    fiwhile true; do......
    donefor value in {1...10}; do......
    done
    

5.shell脚本的调试

  • 调试跟踪(sh -x 脚本文件名)

    • shell脚本文件调试的首选方法,进入调试模式后shell会依次执行语句,产生调试信息(带加号表示该语句是shell执行的,不带加号表示是shell产生的输出)
    [cdl@h3c/home/cdl/Test]$sh -x demo.sh
    + :
    + printFunParams A B C D
    + echo '当前文件名称: demo.sh'
    当前文件名称: demo.sh
    + echo '命令行参数中的第1个参数: A'
    命令行参数中的第1个参数: A
    + echo '命令行参数中的第2个参数: B'
    命令行参数中的第2个参数: B
    + echo '传递给脚本或函数的所有参数: A' B C D
    传递给脚本或函数的所有参数: A B C D
    + echo '传递给脚本或函数的所有参数: A B C D'
    传递给脚本或函数的所有参数: A B C D
    + echo '传递给脚本或函数的所有参数总数: 4'
    传递给脚本或函数的所有参数总数: 4
    
  • 检查语法(sh -n 脚本文件名)

    • 对脚本文件进行语法检查,但是不执行脚本。如果存在语法错误,shell会报错。如果没有错误,则不显示任何内容。
    [cdl@h3c/home/cdl/Test]$cat demo.sh
    #!/bin/bash:<<commentecho "这是shell脚本中整段代码注释的方法,不需要逐行用#进行注释"commentprintFunParams() {echo "当前文件名称: $0"echo "命令行参数中的第1个参数: $1"echo "命令行参数中的第2个参数: $2"echo "传递给脚本或函数的所有参数: $@"echo "传递给脚本或函数的所有参数: $*"echo "传递给脚本或函数的所有参数总数: $#"# 调用带参数的函数
    printFunParams A B C D
    [cdl@h3c/home/cdl/Test]$sh -n demo.sh
    demo.sh: line 22: syntax error: unexpected end of file
    
  • trap语法(信号捕捉)

    • trap命令用于指定在接收到信号signal(SIGHUP、SIGINT、SIGQUIT、SIGKILL、SIGTERM等)后要执行command命令。常见用法:

      • DEBUG信号跟踪分析相关变量值的变化;
      • 脚本程序被中断时完成清理工作;
      • 询问用户是否终止该脚本运行;
  • tee语法(管道复制 tee -a 文件名)

    • tee命令用于读取标准输入的数据,并将其内容输出到文件中,即输出给屏幕和指定文件。例如: ls -l tee file.txt | less

shell中的函数及脚本调试方法相关推荐

  1. linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本

    前言: shell脚本的功能十分强大,这一点毋庸置疑的.那么,平常的工作中总是免不了和脚本打交道,也免不了要自己编写一些脚本. 每个人都希望自己编写的脚本强壮,简单,易用,功能多,并且总是希望脚本运行 ...

  2. shell中的函数shell中的数组告警系统需求分析

    2019独角兽企业重金招聘Python工程师标准>>> 20.16/20.17 shell中的函数 函数的概念 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用 ...

  3. 20.17 shell中的函数

    2019独角兽企业重金招聘Python工程师标准>>> 20.17 shell中的函数 函数:就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这 ...

  4. Linux centosVMware shell中的函数、shell中的数组、

    一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...

  5. shell中的函数、shell中的数组、 告警系统需求分析

    为什么80%的码农都做不了架构师?>>>    20.16/20.17 shell中的函数 shell中的函数 说明:函数就是子shell, 是一个代码段,定义完函数就可以引用它. ...

  6. linux脚本简单定时,shell之定时周期性执行脚本的方法示例

    示例 1.编写测试脚本脚本 time .sh $ cat time.sh #! /bin/bash echo $(date +%s) >> /home/ocean/out.txt 保存完毕 ...

  7. shell中十种实现自加的方法

    shell中十种实现自加的方法 let "n = $n + 1" : $((n = $n + 1)) ((n = n+1)) n=$(($n + 1)) : $[ n = $n + ...

  8. matlab中fprintf函数的具体使用方法

    matlab中fprintf函数的具体使用方法实例如下: fprintf函数可以将数据按指定格式写入到文本文件中.其调用格式为: 数据的格式化输出:fprintf(fid, format, varia ...

  9. Oracle中wm_concat函数报错解决方法

    Oracle中wm_concat函数报错解决方法 参考文章: (1)Oracle中wm_concat函数报错解决方法 (2)https://www.cnblogs.com/52net/archive/ ...

最新文章

  1. [百万级]通用存储过程.分页存储过程
  2. 日本京都大学 77TB重要数据被删;元宇宙要凉?Meta停止开发 VR/AR系统。 | 一周 IT 资讯...
  3. 锐捷ap怎么设置_WiFi又不稳定?怎么办,看这里
  4. Swift - 添加、修改、删除通讯录联系人
  5. 人生路漫漫,还得多输出
  6. java之父_java之父:被下载达7000万次的编程视频教程,你还没有看过?
  7. 用Excel教会你PID算法
  8. 1031 查验身份证 (15 分)—PAT (Basic Level) Practice (中文)
  9. Django---简单from表单提交
  10. 网页php如何判断登录手机串号_php判断是否是手机登陆
  11. Arcgis操作系列一:shp矢量数据的面积计算
  12. 【MySQL】汇总数据
  13. 一篇关于不同进制之间的转换、比如二进制、八进制、十进制、十六进制等
  14. 农夫、羊、菜和狼的故事
  15. Unity 截取3D图像 与 画中画PIP的实现
  16. MES入门.浅谈ISA-95
  17. 使用小程序制作一个飞机大战小游戏
  18. 【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、
  19. 72、【backtrader期货策略】十大经典策略-Aberration策略(布林带策略)(2021-10-29更新)
  20. DEM、DOM、DLG、DRG、DTM、DSM概念解释及联系

热门文章

  1. gradle新建工程,多项目依赖,聚合工程
  2. 只要7天 传统便利店就能免费升级无人超市
  3. web进修之—Hibernate 继承映射(5)
  4. js高级程序设计(六)面向对象
  5. cloudera hbase集群简单思路
  6. C#中调用命令行程序开启wifi热点
  7. 服务API版本控制设计与实践
  8. 这次,让我们捋清:同步、异步、阻塞、非阻塞
  9. 浅谈 Kubernetes 中的服务发现
  10. 百亿估值的Databricks,到底是做什么的?