shell中的函数及脚本调试方法

1.函数格式
  • 目的:将一些相对对立的代码变成函数,提供可读性和重用性,避免重复编写相同代码。
  • 函数格式:
    • 函数关键字:function可以省略,可不带任何参数;
    • 符号{表示函数体的开始(可在函数名后单独一行),符号}表示函数体结束;
    • 函数返回值:
      • 显式返回:加return,return后面接数值n(0~255);
      • 隐式返回:最后一个命令的运行结果;
    [function] 函数名 [(参数列表)] {
        commands;
        [return int;]
    }
    
2.函数调用
  • 调用函数名:所有函数必须在使用前预先定义好,即函数放在脚本文件的开始位置,调用函数时仅使用函数名即可
    #! /bin/bash
    
    foo () {
        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
    
    :<<comment
    
    echo "这是shell脚本中整段代码注释的方法,不需要逐行用#进行注释"
    
    comment
    
    
    printFunParams() {
        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
        ......
    fi
    
    while true; do
        ......
    done
    
    for 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
    
    :<<comment
    
    echo "这是shell脚本中整段代码注释的方法,不需要逐行用#进行注释"
    
    comment
    
    
    printFunParams() {
        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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值