shell中的函数及脚本调试方法
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信号跟踪分析相关变量值的变化;
- 脚本程序被中断时完成清理工作;
- 询问用户是否终止该脚本运行;
- trap命令用于指定在接收到信号signal(SIGHUP、SIGINT、SIGQUIT、SIGKILL、SIGTERM等)后要执行command命令。常见用法:
tee语法(管道复制 tee -a 文件名)
- tee命令用于读取标准输入的数据,并将其内容输出到文件中,即输出给屏幕和指定文件。例如: ls -l tee file.txt | less
shell中的函数及脚本调试方法相关推荐
- linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
前言: shell脚本的功能十分强大,这一点毋庸置疑的.那么,平常的工作中总是免不了和脚本打交道,也免不了要自己编写一些脚本. 每个人都希望自己编写的脚本强壮,简单,易用,功能多,并且总是希望脚本运行 ...
- shell中的函数shell中的数组告警系统需求分析
2019独角兽企业重金招聘Python工程师标准>>> 20.16/20.17 shell中的函数 函数的概念 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用 ...
- 20.17 shell中的函数
2019独角兽企业重金招聘Python工程师标准>>> 20.17 shell中的函数 函数:就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这 ...
- Linux centosVMware shell中的函数、shell中的数组、
一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...
- shell中的函数、shell中的数组、 告警系统需求分析
为什么80%的码农都做不了架构师?>>> 20.16/20.17 shell中的函数 shell中的函数 说明:函数就是子shell, 是一个代码段,定义完函数就可以引用它. ...
- linux脚本简单定时,shell之定时周期性执行脚本的方法示例
示例 1.编写测试脚本脚本 time .sh $ cat time.sh #! /bin/bash echo $(date +%s) >> /home/ocean/out.txt 保存完毕 ...
- shell中十种实现自加的方法
shell中十种实现自加的方法 let "n = $n + 1" : $((n = $n + 1)) ((n = n+1)) n=$(($n + 1)) : $[ n = $n + ...
- matlab中fprintf函数的具体使用方法
matlab中fprintf函数的具体使用方法实例如下: fprintf函数可以将数据按指定格式写入到文本文件中.其调用格式为: 数据的格式化输出:fprintf(fid, format, varia ...
- Oracle中wm_concat函数报错解决方法
Oracle中wm_concat函数报错解决方法 参考文章: (1)Oracle中wm_concat函数报错解决方法 (2)https://www.cnblogs.com/52net/archive/ ...
最新文章
- [百万级]通用存储过程.分页存储过程
- 日本京都大学 77TB重要数据被删;元宇宙要凉?Meta停止开发 VR/AR系统。 | 一周 IT 资讯...
- 锐捷ap怎么设置_WiFi又不稳定?怎么办,看这里
- Swift - 添加、修改、删除通讯录联系人
- 人生路漫漫,还得多输出
- java之父_java之父:被下载达7000万次的编程视频教程,你还没有看过?
- 用Excel教会你PID算法
- 1031 查验身份证 (15 分)—PAT (Basic Level) Practice (中文)
- Django---简单from表单提交
- 网页php如何判断登录手机串号_php判断是否是手机登陆
- Arcgis操作系列一:shp矢量数据的面积计算
- 【MySQL】汇总数据
- 一篇关于不同进制之间的转换、比如二进制、八进制、十进制、十六进制等
- 农夫、羊、菜和狼的故事
- Unity 截取3D图像 与 画中画PIP的实现
- MES入门.浅谈ISA-95
- 使用小程序制作一个飞机大战小游戏
- 【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、
- 72、【backtrader期货策略】十大经典策略-Aberration策略(布林带策略)(2021-10-29更新)
- DEM、DOM、DLG、DRG、DTM、DSM概念解释及联系