小言_互联网的博客

【运维】linux shell 编程之函数使用

401人阅读  评论(0)

前言

使用linux的shell编程,可以说函数是非常重要的内容,也是在编写各类shell脚本的时候经常用到的,本篇将介绍下函数相关的使用。

shell 函数分类

  • 系统函数
  • 自定义函数

系统函数

系统函数为linux自带的函数, 可以在shell编写中直接使用。下面介绍几种常用的系统函数

1、basename

用于获取文件名函数, 根据给出的文件路径截取出文件名;

语法

basename [string / pathname] [suffix]  

  • 根据根据指定字符串或路径名进行截取文件名, 比如: 根据路径"/root/shells/aa.txt", 可以截取出aa.txt;
  • suffix: 用于截取的时候去掉指定的后缀名;

简单案例

比如在当前目录下,有一个叫ch1.sh的文件,使用该命令的效果如下

 

该命令的用途

  • 遍历某个文件目录之后,可以使用该命令拿到该目录下的文件名称做后续处理;
  • 拿到文件名称之后,更改某个匹配的文件的权限等;

2、dirname

从指定文件的绝对路径, 去除文件名,返回剩下的前缀目录路径

语法

dirname 文件绝对路径

简单案例

 

更多的系统函数,可以使用: declare -f 命令进行查看

自定义函数

shell编程人员可以通过自定义开发函数,实现代码重用,提升模块的封装性、可读性以及可维护性;

语法

# 函数的定义
[ function ] funname ()
{
    命令
    [return 返回值]

}

# 调用函数
funname 传递参数1 传递参数2 ...

语法说明

  • 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数;
  • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值, return后跟数值n(0~255);

注意点

必须在调用函数地方之前,先声明函数再调用,shell脚本是逐行运行的, 只有先运行了函数, 后面的动作才可以使用函数;

案例1:无参无返回值函数


  
  1. #!/bin/bash
  2. hello(){
  3. echo "hello func"
  4. }
  5. hello

调用下这个脚本,观察效果展示

 

案例2:无参有返回值函数


  
  1. #! /bin/bash
  2. function sum(){
  3. echo "求两个数的和..."
  4. read -p "请输入第一个数字: " n1
  5. read -p "请输入第二个数字: " n2
  6. echo "两个数字分别为 $n1$n2 "
  7. return $(( $n1+ $n2))
  8. }
  9. sum
  10. echo "两个数字的和为: $? " # 获取函数返回值

运行上面的shell,观察输出效果

案例3:有参函数

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

其他参数介绍

参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

案例介绍

使用上面的参数编写一个输出用户输入参数的示例


  
  1. #!/bin/bash
  2. funParam(){
  3. echo "第一个参数为 $1 !"
  4. echo "第二个参数为 $2 !"
  5. echo "第十个参数为 $10 !"
  6. echo "第十个参数为 ${10} !"
  7. echo "第十一个参数为 ${11} !"
  8. echo "参数总数有 $# 个!"
  9. echo "作为一个字符串输出所有参数 $* !"
  10. }
  11. funParam 1 2 3 4 5 6 7 8 9 10 11 12 15

 

调用上面的脚本观察效果

补充:Shell程序与函数的区别

函数和shell程序比较相似,区别在于:

  • Shell 程序(内置命令和外部脚本文件), 外部脚本文件是在子Shell中运行, 会开启独立的进程运行;
  • Shell函数在当前Shell的进程中运行;

linux shell编程常用案例介绍

以下结合前面关于shell编程技术点的介绍,列举常用的一些可以使用shell编程来处理的场景

1、日志(数据)备份

比如生产环境下,为了保留每天的核心日志,可以使用定时任务,调度某个shell脚本,在脚本中编写程序用于备份日志数据

 

参考示例


  
  1. #!/bin/bash
  2. tar -zcvf log-` date +%Y-%m-%d`.tar.gz log-` date +%Y-%m-%d` /var/log

2、监控内存和磁盘容量,小于给定值时报警

当生产服务器的内存和磁盘容量不足时,可以通过编写shell进行监控报警

参考示例


  
  1. #!/bin/bash
  2. # 提取根分区剩余空间
  3. disk_size=$( df / | awk '/\//{print $4}')
  4. # 提取内存剩余空间
  5. mem_size=$(free | awk '/Mem/{print $4}')
  6. while :
  7. do
  8. # 注意内存和磁盘提取的空间大小都是以 Kb 为单位
  9. if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
  10. then
  11. mail ‐s "Warning" root << EOF
  12. Insufficient resources,资源不足
  13. EOF
  14. fi
  15. done

3、查看有多少远程 IP 连接本机

参考示例


  
  1. #!/bin/bash
  2. # 查看多少远程 IP 连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
  3. # 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有,
  4. # -t仅显示 tcp 连接的信息,‐n 数字格式显示
  5. # Local Address(第四列是本机的 IP 和端口信息)
  6. # Foreign Address(第五列是远程主机的 IP 和端口信息)
  7. # 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息
  8. # sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数
  9. netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c

4、编写nginx启动脚本

在实际的运维中,很多中间件服务,为了方便管理各个中间件服务,可以考虑将其做成各类启动脚本,统一维护,下面以nginx为例说明(其他的,比如redis,zk等可以类似的参考进行编写);


  
  1. #!/bin/bash
  2. # 脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本
  3. # 如果脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务
  4. # service nginx stop 就可以关闭服务
  5. # service nginx restart 可以重启服务
  6. # service nginx status 可以查看服务状态
  7. program=/usr/local/nginx/sbin/nginx
  8. pid=/usr/local/nginx/logs/nginx.pid
  9. start(){
  10. if [ -f $pid ]; then
  11. echo "nginx 服务已经处于开启状态"
  12. else
  13. $program
  14. fi
  15. stop(){
  16. if [ -! -f $pid ]; then
  17. echo "nginx 服务已经关闭"
  18. else
  19. $program -s stop
  20. echo "关闭服务 ok"
  21. fi
  22. }
  23. status(){
  24. if [ -f $pid ]; then
  25. echo "服务正在运行..."
  26. else
  27. echo "服务已经关闭"
  28. fi
  29. }
  30. case $1 in
  31. start)
  32. start;;
  33. stop)
  34. stop;;
  35. restart)
  36. stop
  37. sleep 1
  38. start;;
  39. status)
  40. status;;
  41. *)
  42. echo "你输入的语法格式错误"
  43. esac


转载:https://blog.csdn.net/congge_study/article/details/127358033
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场