函数Bourne Shell 是一个最初由 Stephen Bourne 写成的 Unix shell它于 1977 年首次发布是 Unix 环境中最早也是最基本的 shell 之一。Bourne Shell 中的函数定义使用 function 关键字或只使用小括号 () 来定义函数名。后来Bourne Shell 的功能逐渐得到完善和增强产生了多种 shell如 C Shell、Korn Shell、Bash 等。这些新的 shell 每一种都支持函数但有所不同。例如C Shell 使用 () 作为函数定义的符号而 Bash 可以使用 function 或 () 两种方式来定义函数名。函数是一段在 Shell 脚本中定义的可执行代码块它可以被多次调用并返回结果。通过定义函数可以将一系列命令和操作组织到一个可重用的代码块中以提高脚本的可读性和可维护性。函数包含以下几个优点代码重用性使用函数封装一组经常使用的命令后可以使得这些代码可以在脚本中多次调用。这样可以提高代码的重用性减少代码冗余。模块化和可读性将一段代码封装成函数可以提高脚本的模块化程度使得脚本更易于理解和维护。参数传递函数可以接受参数并在调用时传递参数。这使得函数更加灵活可以根据不同的参数执行不同的操作。局部变量函数中定义的变量默认是局部变量只在函数内部可见。函数调用完成后自动销毁减少内存使用量。循环控制语句break、continue、exitbreakcontinueexit三个关键字三个关键字都能解决什么问题break关键字中断当前循环#!/bin/bash # 到11的时候结束循环注意是包括11还是不包括11 for i in {1..20} do echo $i echo 这里代码什么时候会执行呢 done echo 程序结束~代码执行结果是do和done之间的循环体执行20次 循环外的代码执行一次就结束#!/bin/bash # 到11的时候结束循环注意是包括11还是不包括11 for i in {1..20} do echo $i if [ $i 11 ];then break fi echo 这里代码什么时候会执行呢 done echo 程序结束~让你理解break的语句作用是当执行到break会中断当前for循环的执行for i in {1..20}遇见break 就直接结束for循环了 剩下的循环不执行了continue 跳过本次循环continue1. 跳过本次循环忽略本次循环的代码执行直接进入下一次循环直到结束。2. 循环结束后循环外部的代码依然继续。打印1 ~ 20跳过6和16for循环版本#!/bin/bash # 到11的时候结束循环 for i in {1..20} do if [ $i 6 -o $i 16 ];then continue fi echo $i echo 这里代码什么时候会执行呢 done echo 程序结束~执行结果是exit关键字中断当前程序执行当前脚本进程退出shell函数开发轻松理解函数的意义为什么要用函数不用函数的代码会乱成什么样进行函数美化之后的代码语法1,通过function关键字定义shell的函数先定义后调用封装需要重复性执行的代码减少代码量优化美化代码写法1定义函数通过关键字 function 定义# 定义第一个函数名字是 hello function hello(){ # 被封装的代码执行该函数就会执行这里的函数体 echo hello chaoge linux. } # 封装的另一个函数名字是 ngx_status function ngx_status(){ # 函数体 代码 systemctl status nginx ps -ef|grep nginx } # 执行函数 # 直接写函数的名字即可 hello ngx_status执行函数的脚本函数的定义和执行语法2懒人写法定义函数1 # 定义第一个函数名字是 hello 2 hello(){ 3 # 被封装的代码执行该函数就会执行这里的函数体 4 echo hello chaoge linux. 5 } 6 7 8 # 封装的另一个函数名字是 ngx_status 9 10 ngx_status(){ 11 # 函数体 代码 12 systemctl status nginx 13 ps -ef|grep nginx 14 } 15 16 17 huilema(){ 18 19 echo 同志们函数会玩了吗要学会看脚本看到新脚本fucntions脚本库函数好几百行先看头尾从哪到哪 20 21 } 22 23 24 25 # 执行函数 26 # 直接写函数的名字即可 27 28 hello 29 30 # 1. 函数名要写对了 31 ngx_status 32 33 34 huilema 35 36 37 # 错误2先定义再调用执行 38 39 40 41 42 # 函数名定义见名知意 43 install_start_nginx(){ 44 45 # 1. 安装nginx 46 # 2.启动 47 yum install nginx -y 48 systemctl start nginx 49 } 50 51 52 53 install_start_nginx ~0.函数定义调用执行的语法#!/bin/bash hello(){ echo 这是函数体中的代码 } # 写一次就执行一次函数体中所有的代码 hello # 执行多次 hello hello1.函数从文件中导入fcun1.sh #定义一些变量函数 # 只定义不调用 name吴彦祖 echo_name(){ echo 该变量name的值是$name }func2.sh2.函数传参编写代码可以通过对函数传参的方式来提高代码灵活性比如需要将某个文件夹下500多个文件中的空行删除因为每个文件名字不相同如果不使用函数则需要编写500行代码。使用函数将更加简单1. 这里的函数传参是指单独给函数传递执行参数和给脚本传入参数是两码事2. 函数传参是指函数在执行的时候可以传入位置参数这样函数连带参数一起执行。我们封装一个删除空行的函数使用 for 循环遍历文件将其传递给函数逐个删除空行。可能有小伙伴会认为我不使用函数直接将 sed 命令放在 for 循环下面岂不是更简单。这样当然可以的这里只是为了举一个例子。如果需求不只是删除空行还有其他一大堆需求呢那必然需要函数来使得代码更加整洁。当然了是否使用函数还是看需求我们的宗旨是代码简洁、易阅读就行。函数传入参数的执行#!/bin/bash function hello(){ echo 函数开始执行 # 注意这里的参数 echo 函数体中接收的参数1 $1 echo 函数体中接收的参数2 $2 } # 这里传入的是函数参数 hello laoliu laoba echo 函数外可以正常的接收位置参数1 $1 echo 函数外可以正常的接收位置参数2 $2运行结果不传入脚本的位置参数运行2给脚本传入位置参数我们来利用 $ 来优化代码将需要检测的IP放入数组中直接将该数组的值全部传入函数。# 需要测试的IP test_ip(192.168.1.7 192.168.1.8 192.168.1.9) # 封装一个检查IP的方法 TestAddress(){ # 遍历所有IP for ip in $;do if ping -c 3 ${ip} /dev/null;then echo IP ${ip} 可以ping通 else echo IP ${ip} 无法ping通 fi done } # 调用这个方法多个IP也只需要调用一次 TestAddress ${test_ip[]}除了使用 $ 方法还可以使用 shift 来删除第一个的参数。先来看一个简单的示例Func(){ # 删除第1个参数 shift # 打印当前第一个参数 echo 第1个参数的值是$1 # 打印全部参数 echo 当前的全部参数包含$ } # 向函数中传入3个参数 Func AAA BBB CCC也可以指定删除n个参数shift [n]Func(){ # 删除前2个参数 shift 2 # 打印当前第一个参数 echo 第1个参数的值是$1 # 打印全部参数 echo 当前的全部参数包含$ } # 向函数中传入3个参数 Func AAA BBB CCC我们将这个方法代入测试IP中# 需要测试的IP test_ip(192.168.1.7 192.168.1.8 192.168.1.9) # 封装一个检查IP的方法 TestAddress(){ # 参数个数不等于0时循环执行 while [ $# -ne 0 ];do # 检测第1个参数 local ip$1 if ping -c 3 ${ip} /dev/null;then echo IP ${ip} 可以ping通 else echo IP ${ip} 无法ping通 fi # 检测完后删除第一个参数 shift done } TestAddress ${test_ip[]}3.计算器函数版综合玩法函数直接 调用 脚本的位置参数# 写一个函数接收函数参数 #!/binbash calc(){ case $2 in ) echo $1 $3 $[$1$3] ;; -) echo $1 - $3 $[$1-$3] ;; ×) echo $1 * $3 $[$1*$3] ;; /) echo $1 / $3 $[$1/$3] ;; *) # $0 依然是指文件名 echo usage: bash $0 num1 {|-|×|/} num2 esac } # 调用函数传参、且传递脚本的位置参数 calc $1 $2 $3测试执行4.nginx管理脚本函数版#!/bin/bash # 函数1帮助信息的函数 Usage(){ echo Usage bash $0 {start|stop|restart} } # 启动nginx start_nginx(){ echo nginx启动中 # /usr/bin/nginx -c /etc/nginx/nginx.conf } # 函数3关闭nginx stop_nginx(){ echo nginx已关闭 } # 接收用户输入指令 # $1 参数是谁运行脚本时传入的一个参数绕德清刷1111 case $1 in start) start_nginx ;; stop) stop_nginx ;; restart) stop_nginx start_nginx ;; *) Usage esac你以后写服务管理脚本启动停止重启的代码逻辑给封装成函数5.多级菜单由外到内一层层写即可#!/bin/bash # author: www.yuchaoit.cn # 菜单封装函数便于调用 menu1(){ echo -e 欢迎来到于超老师的linux课程 兄弟请你按照如下规则输入选项 1. Install Nginx 2. Install Mysql 3. Install Redis 4. bye } nginx_menu(){ echo -e 请选择对于软件版本 1. Install Nginx1.15 2. Install Nginx1.16 3. Install Nginx1.17 4. 返回上一层 } mysql_menu(){ echo mysql菜单还在开发中..... } # 程序打印菜单1 menu1 while true do # 用户选择菜单1 read -p 您请输入对应的序号 num1 # 一级条件判断 case $num1 in 1) # 进入菜单2 nginx_menu while true do read -p 请选择对应的nginx版本 num2 case $num2 in 1) echo 成功安装nginx 1.15版本 ;; 2) echo 成功安装nginx 1.16版本 ;; 3) echo 成功安装nginx 1.7版本 ;; 4) # 清屏返回上一层 clear menu1 # 中断二级菜单的循环 break ;; *) echo 请按规则填写 1 ~ 4 序号.... esac done ;; 2) mysql_menu ;; 3) echo redis菜单于超老师努力开发中。。。 ;; 4) echo bye bye 。 exit ;; *) echo 请按规则输入菜单序号1 ~ 4 continue esac done6、实际应用实时监控硬件资源编写一个按指定次数和间隔时间去监控硬件CPU使用率、内存使用情况、磁盘使用情况通过表格的方式输出结果。# 封装一个输出表格的方法 OutputTable(){ local str_interval20 # 设定每个单元格的长度 local symbol— # 设定表格的字符 local col$# # 列数 local arr($) # 接收所有数组 local mode${arr[0]} # 第1个参数表示模式 local data(${arr[]:1}) # 第1个参数后面的表示表格中的数据 # 计算输出的字符长度 local total_length$(((col - 1) * str_interval col )) local table_symbol$(perl -E say ${symbol} x ${total_length}) # 如果模式为0输出表头 if [ ${mode} -eq 0 ];then echo -e ${table_symbol} for ((i0; i${#data[]}; i));do [ $[i1] -ne ${#data[]} ] printf |%-${str_interval}s ${data[${i}]} || printf |%-${str_interval}s|\n ${data[${i}]} done echo -e ${table_symbol} # 如果模式为1输出数据信息 elif [ ${mode} -eq 1 ];then for ((i0; i${#data[]}; i));do [ $[i1] -ne ${#data[]} ] printf |%-${str_interval}s ${data[${i}]} || printf |%-${str_interval}s|\n ${data[${i}]} done echo -e ${table_symbol} fi } # 封装一个监控硬件资源的方法 MonitoringHardware(){ # 定义监控间隔时间和监控次数 local interval$1 local count$2 # 输出表格头 OutputTable 0 CPU_used Memory_used Disk_used Monitoring_time for ((c1; ccount; c));do # 获取CPU利用率、内存使用大小、磁盘使用大小、时间 local current_time$(date %Y-%m-%d_%H:%M:%S) local cpu_used$(top -b -n 1 -p 1 |awk -F , /^%Cpu/ {print $4} |awk {print 100 - $1 %}) local mem_used$(free -h |awk NR2{print $3 / $2}) local disk_used$(df -h pwd |awk NR2{print $3 / $2}) # 使用表格输出数据 OutputTable 1 ${cpu_used} ${mem_used} ${disk_used} ${current_time} sleep ${interval} done } # 调用这个监控函数使用外部传参来指定监控间隔时间和次数 MonitoringHardware $1 $2随机输出小学生计算题编写一个输出随机加法、减法、乘法、除法的计算题并判断是否输出答案。# 是否输出答案 output_answeryes # 设定列数 col$1 # 设定行数 row$2 # 设定运算符(加法:add, 减法:sub, 乘法:mul, 除法:div, 全部:all) operator$3 # 设定数字在多少以内 integer_size100 # 封装一个加法的函数 Calculations(){ local interval20 for ((r1; rrow; r));do result for ((c1; ccol; c));do int1$((RANDOM % integer_size)) int2$((RANDOM % integer_size)) # 输出加法 if [ ${operator} add ];then result${result} $(awk BEGIN{print ${int1} ${int2}}) str${int1} ${int2} ? printf %-${interval}s ${str} # 输出减法 elif [ ${operator} sub ];then result${result} $(awk BEGIN{print ${int1} - ${int2}}) str${int1} - ${int2} ? printf %-${interval}s ${str} # 输出乘法 elif [ ${operator} mul ];then result${result} $(awk BEGIN{print ${int1} * ${int2}}) str${int1} * ${int2} ? printf %-${interval}s ${str} # 输出除法 elif [ ${operator} div ];then [ ${int2} -eq 0 ] int21 result${result} $(awk -v n1${int1} -v n2${int2} BEGIN{printf %.2f, n1 / n2}) str${int1} / ${int2} ? printf %-${interval}s ${str} fi done # 输出答案 [ ${output_answer} yes ] printf %-${interval}s\n answer:${result} || echo done } # 如果全部输出则调用4次函数 if [ ${operator} all ];then for i in add sub mul div;do operator${i} Calculations done # 如果只输出一种模式按原方法调用 else Calculations fi
shell函数
函数Bourne Shell 是一个最初由 Stephen Bourne 写成的 Unix shell它于 1977 年首次发布是 Unix 环境中最早也是最基本的 shell 之一。Bourne Shell 中的函数定义使用 function 关键字或只使用小括号 () 来定义函数名。后来Bourne Shell 的功能逐渐得到完善和增强产生了多种 shell如 C Shell、Korn Shell、Bash 等。这些新的 shell 每一种都支持函数但有所不同。例如C Shell 使用 () 作为函数定义的符号而 Bash 可以使用 function 或 () 两种方式来定义函数名。函数是一段在 Shell 脚本中定义的可执行代码块它可以被多次调用并返回结果。通过定义函数可以将一系列命令和操作组织到一个可重用的代码块中以提高脚本的可读性和可维护性。函数包含以下几个优点代码重用性使用函数封装一组经常使用的命令后可以使得这些代码可以在脚本中多次调用。这样可以提高代码的重用性减少代码冗余。模块化和可读性将一段代码封装成函数可以提高脚本的模块化程度使得脚本更易于理解和维护。参数传递函数可以接受参数并在调用时传递参数。这使得函数更加灵活可以根据不同的参数执行不同的操作。局部变量函数中定义的变量默认是局部变量只在函数内部可见。函数调用完成后自动销毁减少内存使用量。循环控制语句break、continue、exitbreakcontinueexit三个关键字三个关键字都能解决什么问题break关键字中断当前循环#!/bin/bash # 到11的时候结束循环注意是包括11还是不包括11 for i in {1..20} do echo $i echo 这里代码什么时候会执行呢 done echo 程序结束~代码执行结果是do和done之间的循环体执行20次 循环外的代码执行一次就结束#!/bin/bash # 到11的时候结束循环注意是包括11还是不包括11 for i in {1..20} do echo $i if [ $i 11 ];then break fi echo 这里代码什么时候会执行呢 done echo 程序结束~让你理解break的语句作用是当执行到break会中断当前for循环的执行for i in {1..20}遇见break 就直接结束for循环了 剩下的循环不执行了continue 跳过本次循环continue1. 跳过本次循环忽略本次循环的代码执行直接进入下一次循环直到结束。2. 循环结束后循环外部的代码依然继续。打印1 ~ 20跳过6和16for循环版本#!/bin/bash # 到11的时候结束循环 for i in {1..20} do if [ $i 6 -o $i 16 ];then continue fi echo $i echo 这里代码什么时候会执行呢 done echo 程序结束~执行结果是exit关键字中断当前程序执行当前脚本进程退出shell函数开发轻松理解函数的意义为什么要用函数不用函数的代码会乱成什么样进行函数美化之后的代码语法1,通过function关键字定义shell的函数先定义后调用封装需要重复性执行的代码减少代码量优化美化代码写法1定义函数通过关键字 function 定义# 定义第一个函数名字是 hello function hello(){ # 被封装的代码执行该函数就会执行这里的函数体 echo hello chaoge linux. } # 封装的另一个函数名字是 ngx_status function ngx_status(){ # 函数体 代码 systemctl status nginx ps -ef|grep nginx } # 执行函数 # 直接写函数的名字即可 hello ngx_status执行函数的脚本函数的定义和执行语法2懒人写法定义函数1 # 定义第一个函数名字是 hello 2 hello(){ 3 # 被封装的代码执行该函数就会执行这里的函数体 4 echo hello chaoge linux. 5 } 6 7 8 # 封装的另一个函数名字是 ngx_status 9 10 ngx_status(){ 11 # 函数体 代码 12 systemctl status nginx 13 ps -ef|grep nginx 14 } 15 16 17 huilema(){ 18 19 echo 同志们函数会玩了吗要学会看脚本看到新脚本fucntions脚本库函数好几百行先看头尾从哪到哪 20 21 } 22 23 24 25 # 执行函数 26 # 直接写函数的名字即可 27 28 hello 29 30 # 1. 函数名要写对了 31 ngx_status 32 33 34 huilema 35 36 37 # 错误2先定义再调用执行 38 39 40 41 42 # 函数名定义见名知意 43 install_start_nginx(){ 44 45 # 1. 安装nginx 46 # 2.启动 47 yum install nginx -y 48 systemctl start nginx 49 } 50 51 52 53 install_start_nginx ~0.函数定义调用执行的语法#!/bin/bash hello(){ echo 这是函数体中的代码 } # 写一次就执行一次函数体中所有的代码 hello # 执行多次 hello hello1.函数从文件中导入fcun1.sh #定义一些变量函数 # 只定义不调用 name吴彦祖 echo_name(){ echo 该变量name的值是$name }func2.sh2.函数传参编写代码可以通过对函数传参的方式来提高代码灵活性比如需要将某个文件夹下500多个文件中的空行删除因为每个文件名字不相同如果不使用函数则需要编写500行代码。使用函数将更加简单1. 这里的函数传参是指单独给函数传递执行参数和给脚本传入参数是两码事2. 函数传参是指函数在执行的时候可以传入位置参数这样函数连带参数一起执行。我们封装一个删除空行的函数使用 for 循环遍历文件将其传递给函数逐个删除空行。可能有小伙伴会认为我不使用函数直接将 sed 命令放在 for 循环下面岂不是更简单。这样当然可以的这里只是为了举一个例子。如果需求不只是删除空行还有其他一大堆需求呢那必然需要函数来使得代码更加整洁。当然了是否使用函数还是看需求我们的宗旨是代码简洁、易阅读就行。函数传入参数的执行#!/bin/bash function hello(){ echo 函数开始执行 # 注意这里的参数 echo 函数体中接收的参数1 $1 echo 函数体中接收的参数2 $2 } # 这里传入的是函数参数 hello laoliu laoba echo 函数外可以正常的接收位置参数1 $1 echo 函数外可以正常的接收位置参数2 $2运行结果不传入脚本的位置参数运行2给脚本传入位置参数我们来利用 $ 来优化代码将需要检测的IP放入数组中直接将该数组的值全部传入函数。# 需要测试的IP test_ip(192.168.1.7 192.168.1.8 192.168.1.9) # 封装一个检查IP的方法 TestAddress(){ # 遍历所有IP for ip in $;do if ping -c 3 ${ip} /dev/null;then echo IP ${ip} 可以ping通 else echo IP ${ip} 无法ping通 fi done } # 调用这个方法多个IP也只需要调用一次 TestAddress ${test_ip[]}除了使用 $ 方法还可以使用 shift 来删除第一个的参数。先来看一个简单的示例Func(){ # 删除第1个参数 shift # 打印当前第一个参数 echo 第1个参数的值是$1 # 打印全部参数 echo 当前的全部参数包含$ } # 向函数中传入3个参数 Func AAA BBB CCC也可以指定删除n个参数shift [n]Func(){ # 删除前2个参数 shift 2 # 打印当前第一个参数 echo 第1个参数的值是$1 # 打印全部参数 echo 当前的全部参数包含$ } # 向函数中传入3个参数 Func AAA BBB CCC我们将这个方法代入测试IP中# 需要测试的IP test_ip(192.168.1.7 192.168.1.8 192.168.1.9) # 封装一个检查IP的方法 TestAddress(){ # 参数个数不等于0时循环执行 while [ $# -ne 0 ];do # 检测第1个参数 local ip$1 if ping -c 3 ${ip} /dev/null;then echo IP ${ip} 可以ping通 else echo IP ${ip} 无法ping通 fi # 检测完后删除第一个参数 shift done } TestAddress ${test_ip[]}3.计算器函数版综合玩法函数直接 调用 脚本的位置参数# 写一个函数接收函数参数 #!/binbash calc(){ case $2 in ) echo $1 $3 $[$1$3] ;; -) echo $1 - $3 $[$1-$3] ;; ×) echo $1 * $3 $[$1*$3] ;; /) echo $1 / $3 $[$1/$3] ;; *) # $0 依然是指文件名 echo usage: bash $0 num1 {|-|×|/} num2 esac } # 调用函数传参、且传递脚本的位置参数 calc $1 $2 $3测试执行4.nginx管理脚本函数版#!/bin/bash # 函数1帮助信息的函数 Usage(){ echo Usage bash $0 {start|stop|restart} } # 启动nginx start_nginx(){ echo nginx启动中 # /usr/bin/nginx -c /etc/nginx/nginx.conf } # 函数3关闭nginx stop_nginx(){ echo nginx已关闭 } # 接收用户输入指令 # $1 参数是谁运行脚本时传入的一个参数绕德清刷1111 case $1 in start) start_nginx ;; stop) stop_nginx ;; restart) stop_nginx start_nginx ;; *) Usage esac你以后写服务管理脚本启动停止重启的代码逻辑给封装成函数5.多级菜单由外到内一层层写即可#!/bin/bash # author: www.yuchaoit.cn # 菜单封装函数便于调用 menu1(){ echo -e 欢迎来到于超老师的linux课程 兄弟请你按照如下规则输入选项 1. Install Nginx 2. Install Mysql 3. Install Redis 4. bye } nginx_menu(){ echo -e 请选择对于软件版本 1. Install Nginx1.15 2. Install Nginx1.16 3. Install Nginx1.17 4. 返回上一层 } mysql_menu(){ echo mysql菜单还在开发中..... } # 程序打印菜单1 menu1 while true do # 用户选择菜单1 read -p 您请输入对应的序号 num1 # 一级条件判断 case $num1 in 1) # 进入菜单2 nginx_menu while true do read -p 请选择对应的nginx版本 num2 case $num2 in 1) echo 成功安装nginx 1.15版本 ;; 2) echo 成功安装nginx 1.16版本 ;; 3) echo 成功安装nginx 1.7版本 ;; 4) # 清屏返回上一层 clear menu1 # 中断二级菜单的循环 break ;; *) echo 请按规则填写 1 ~ 4 序号.... esac done ;; 2) mysql_menu ;; 3) echo redis菜单于超老师努力开发中。。。 ;; 4) echo bye bye 。 exit ;; *) echo 请按规则输入菜单序号1 ~ 4 continue esac done6、实际应用实时监控硬件资源编写一个按指定次数和间隔时间去监控硬件CPU使用率、内存使用情况、磁盘使用情况通过表格的方式输出结果。# 封装一个输出表格的方法 OutputTable(){ local str_interval20 # 设定每个单元格的长度 local symbol— # 设定表格的字符 local col$# # 列数 local arr($) # 接收所有数组 local mode${arr[0]} # 第1个参数表示模式 local data(${arr[]:1}) # 第1个参数后面的表示表格中的数据 # 计算输出的字符长度 local total_length$(((col - 1) * str_interval col )) local table_symbol$(perl -E say ${symbol} x ${total_length}) # 如果模式为0输出表头 if [ ${mode} -eq 0 ];then echo -e ${table_symbol} for ((i0; i${#data[]}; i));do [ $[i1] -ne ${#data[]} ] printf |%-${str_interval}s ${data[${i}]} || printf |%-${str_interval}s|\n ${data[${i}]} done echo -e ${table_symbol} # 如果模式为1输出数据信息 elif [ ${mode} -eq 1 ];then for ((i0; i${#data[]}; i));do [ $[i1] -ne ${#data[]} ] printf |%-${str_interval}s ${data[${i}]} || printf |%-${str_interval}s|\n ${data[${i}]} done echo -e ${table_symbol} fi } # 封装一个监控硬件资源的方法 MonitoringHardware(){ # 定义监控间隔时间和监控次数 local interval$1 local count$2 # 输出表格头 OutputTable 0 CPU_used Memory_used Disk_used Monitoring_time for ((c1; ccount; c));do # 获取CPU利用率、内存使用大小、磁盘使用大小、时间 local current_time$(date %Y-%m-%d_%H:%M:%S) local cpu_used$(top -b -n 1 -p 1 |awk -F , /^%Cpu/ {print $4} |awk {print 100 - $1 %}) local mem_used$(free -h |awk NR2{print $3 / $2}) local disk_used$(df -h pwd |awk NR2{print $3 / $2}) # 使用表格输出数据 OutputTable 1 ${cpu_used} ${mem_used} ${disk_used} ${current_time} sleep ${interval} done } # 调用这个监控函数使用外部传参来指定监控间隔时间和次数 MonitoringHardware $1 $2随机输出小学生计算题编写一个输出随机加法、减法、乘法、除法的计算题并判断是否输出答案。# 是否输出答案 output_answeryes # 设定列数 col$1 # 设定行数 row$2 # 设定运算符(加法:add, 减法:sub, 乘法:mul, 除法:div, 全部:all) operator$3 # 设定数字在多少以内 integer_size100 # 封装一个加法的函数 Calculations(){ local interval20 for ((r1; rrow; r));do result for ((c1; ccol; c));do int1$((RANDOM % integer_size)) int2$((RANDOM % integer_size)) # 输出加法 if [ ${operator} add ];then result${result} $(awk BEGIN{print ${int1} ${int2}}) str${int1} ${int2} ? printf %-${interval}s ${str} # 输出减法 elif [ ${operator} sub ];then result${result} $(awk BEGIN{print ${int1} - ${int2}}) str${int1} - ${int2} ? printf %-${interval}s ${str} # 输出乘法 elif [ ${operator} mul ];then result${result} $(awk BEGIN{print ${int1} * ${int2}}) str${int1} * ${int2} ? printf %-${interval}s ${str} # 输出除法 elif [ ${operator} div ];then [ ${int2} -eq 0 ] int21 result${result} $(awk -v n1${int1} -v n2${int2} BEGIN{printf %.2f, n1 / n2}) str${int1} / ${int2} ? printf %-${interval}s ${str} fi done # 输出答案 [ ${output_answer} yes ] printf %-${interval}s\n answer:${result} || echo done } # 如果全部输出则调用4次函数 if [ ${operator} all ];then for i in add sub mul div;do operator${i} Calculations done # 如果只输出一种模式按原方法调用 else Calculations fi