31人参与 • 2025-04-15 • Powershell
shell函数可用于存放一系列的指令。
在shell脚本执行的过过程中,函数被置于内存中,每次调用函数时不需要从硬盘读取,因此运行的速度比较快。
在shell编程中函数并非是必须的元素,但使用函数可以对程序进行更好的组织。
将一些相对独立的代码变成函数女,可以提高程序可读性与重用性,避免编写大量重复代码。
shell函数定义的方法如下所示:
[function]函数名() { 命令序列 [return x] }
使用shell脚本实现两个数相加求和,通过定义函数的方式来完成。
sum函数内部通过read命接收用户分别输入的两个数,然后做加法运算,最后通过调用函数的方式来输出两个数的和。
[root@localhost ~]# vim sum. sh #!/bin/bash sum() { echo"请输入第一个数:" read num1 if![[[$num1 =~ ^[0-9]+$ ]]; then echo"输入的第一个数不是有效的整数,请重新运行脚本并输入正确的数字。" return 1 fi echo"请输入第二个数:" read num2echo"输入的第一个数不是有效的整数,请重新运行脚本并输入正确的数字。" return 1 fi echo"请输入第二个数:" read num2 if![[[ $num2 =~ ^[0-9]+$ ]]; then echo"输入的第二个数不是有效的整数,请重新运行脚本并输入正确的数字。" return 1 fi result=$((num1 + num2)) echo"两数之和为:$result" sum
[root@localhost ~]# chmod +x sum.sh [root@localhost ~]# ./sum.sh 请输入第一个数:2 请输入第二个数:3 "你输入的两个数为:2和3." "两个数的和为:5"
该函数会定期监控系统的cpu和内存使用率,当使用率超过设定的阈直时,会发送报警信息,这里简单模拟为输出到控制台,实际应用中可扩展为发送邮件、短信等。
[root@localhost ~]# vim jiankong.sh #!/bin/bash #发送报警信息的函数 send alert() { local message=$1 echo "alert: $message" } monitor_system_resources() { local cpu_threshold=$1 local mem_threshold=$2 local interval=$3 while true; do cpu_usage=$(top -bn1 | grep "cpu(s)" | awk '{print$2+$4}') mem_usage=$(free | awk '/mem/ {printf("%.2f",$3/$2 * 1((00)}. if(( $(echo "$cpu_usage > $cpu_threshold" | bc -1) )); then send_alert "cpu usage ($cpu_usage%)." fi if(( $(echo "$mem_usage > $mem_threshold" | bc-1) )); then send_alert "memory usage ($mem_usage%)." fi sleep "$interval" done } monitor_system_resources 5 1 5
在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
[root@localhost ~]# vim fun_scope.sh myfun () { local i i=8 echo $i } i=9 myfun echo $i
[root@localhost ~]# chmod +x fun_scope.sh [root@localhost ~]# ./fun_scope.sh 8 9
函数的参数的用法如下。
函数名称 参数1 参数2 参数3.
在使用函数参数时,函数名称在前参数在后,函数名和参数之间用空格分隔,可以有多个参数,参数使用$1,$2,$3....的方式表达。
[root@localhost ~]# vim write_log.sh #!/bin/bash mydir="/data" outfile="${mydir}/my.log" [ -e "${mydir}" ] | mkdir -p ${mydir} appendfile() { echo "$2" >> "$1" } appendfile ${outfile} "first line content." appendfile ${outfile} "second line content."
[root@localhost ~]# chmod +x write_log.sh [root@localhost ~]# ./write_log.sh [root@localhost ~]# cat /data/my.log firstline content. second line content.
shell也可以实现递归函数,就是可以调用自己本身的函数。
在linux系统上编写shell脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和和目录,逐层递归列出,并对这些层级关系进行展示。
[root@localhost ~]# vim fun_recursion.sh #!/bin/bash traverse_directory() { local dir=$1 for item in "$dir"/*; do if [ -d "$item" ]; then echo "directory: $item" traverse_directory "$item" elif [ -f "$item" ]; then echo "file: $item" fi done } traverse_directory "."
[root@localhost ~]# chmod +x fun_recursion.sh [root@localhost ~]# ./fun_recursion.sh
在shell脚本中,数组是一种常见的数据结构,shell中的数组与java、c、python不同,只有维数组,没有二维数组。
数组元素的大小与限制,也不需要事先定义。
shell数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从0开始.
数组名=(value0value1value2...
数组名=([0]=value [1]=value [2]=value...)
列表名="valueevalue1value2."数组名=($列表名)
数组名[0]="value"数组名[1]="value"数组名[2]="value
获取普通数组长度可以使用${#数组名[@]}或${#数组名[*]}这两种语法效果一样。
[root@localhost ~]# arr_number=(1 2 3 4 5) [root@localhost ~]# arr_length=${#arr_number[*]} [root@localhost ~]# echo $arr_length 5 [root@localhost ~]# arr_length_1=${#arr_number[@] [root@localhost ~]# echo $arr_length_1 5
在shell编程里,你可以读取数组中指定下标的元素,也可以给指定下标的数组元素赋值。
[root@localhost ~]# arr_index2=${arr_number[2]} [root@localhost ~]# echo $arr_index2 з
在shell编程里,数组遍历指的是按顺序访问数组中的每一个元素,并对这些元素执行特定操作的过程。
[root@localhost ~]# vim array_traverse.sh #!/bin/bash arr_number=(1 2 3 4 5) for i in ${arr_number[@]} do echo $i done
[root@localhost ~]# chmod +x array_traverse.sh [root@localhost ~]# ./array_traverse.sh 1 2 3 4 5
数组切片是一种操作,用于从数组中提取出一部分连续的元素,形成一个新的数组,此存操作在不同的版本种存在差异。
[root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# echo ${arr[@]} 12345 [root@localhost ~]# echo ${arr[@]:0:2} 1 2 [root@localhost ~]# echo ${arr[@]:2:3} 3 4 5
[root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# echo ${arr[@]/4/66} 1 2 3 66 5 [root@localhost ~]# echo ${arr[@]} 1 2 3 4 5 [root@localhost ~]# arr=(${arr[@]/4/66}) [root@localhost ~]# echo ${arr[@]} 1 2 3 66 5
[root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# unset arr
[root@localhost ~]# echo ${arr[*]} [root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# unset arr[2] [root@localhost ~]# echo ${arr[*]} 1 2 4 5
在shell脚本开发中,要注意把复杂的脚本简单化,思路要清晰,分段。
除echo外,bash shell亦有相应的参数可以调试脚本。
使用bash参数调试,语法为:
sh [-nvx] 脚本名
[root@localhost ~ vim test.sh #!/bin/bash set-x/ read-p"请输入您的分数(0-100):"grade if[$grade -ge 85 ] && [ $grade -le 100 ] then echo"$grade分!优秀" elif [ $grade -ge 70 ] & [ $grade -1e 84 ] then echo"$grade分,合格"else echo"$grade分?不合格" fi set +x
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论