一、函数
在编写脚本时,有些脚本可以反复使用,可以调用函数来解决
语句块定义成函数约等于别名
函数使用方法:
- 定义函数
- 再引用函数
1.function 函数名{ 命令序列}2.函数名(){命令序列}3.function func_name () { ...函数体...}
注意事项:
- 直接写函数中调用函数 直接写函数名
- 同名函数后一个生效
- 调用函数一定要先定义
- 只要先定义了调用的 其他函数定义顺序无关
func_name (){...函数体...}一、定义函数:[root@localhost data]#func1 (){ hostname;date;}1、定义函数[root@localhost data]#func12、调用函数localhost.localdomain2021年 10月 23日 星期六 10:23:50 CST3、注意调用的位置h () {echo "hello"}nihao () {echo `h` `w`}w () {echo "world"}nihao####同名函数
1.1查看函数
[root@localhost ~]# declare -F#函数列表declare -f __HOSTNAMEdeclare -f __SIZEdeclare -f __SLAVEURL[root@localhost ~]# declare -f#函数具体的定义判断操作系统版本:[root@localhost ~]#cat /etc/os-release NAME="CentOS Linux"VERSION="7 (Core)"ID="centos"ID_LIKE="rhel fedora"VERSION_ID="7"PRETTY_NAME="CentOS Linux 7 (Core)"ANSI_COLOR="0;31"CPE_NAME="cpe:/o:centos:centos:7"HOME_URL="https://www.centos.org/"BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"CENTOS_MANTISBT_PROJECT_VERSION="7"REDHAT_SUPPORT_PRODUCT="centos"REDHAT_SUPPORT_PRODUCT_VERSION="7"
1.2删除函数
unset func_name #删除函数[root@localhost ~]# diranaconda-ks.cfg pricegame.sh sum.sh 公共 视频 文档 音乐initial-setup-ks.cfg sum1.sh yum.sh 模板 图片 下载 桌面
1.3函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:
- 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
- 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bashtest1 () { read -p "请输入一个数字:" num return $[$num*2]}test1echo $?
怎么解决超过 255
#!/bin/bashtest1 () { read -p "请输入一个数字:" num echo $[$num*2]}result=`test1`echo $result
return 的用法:user () {if [ $USER = root ] thenecho "这是管理员用户"elseecho "这不是管理员用户"return 1fi}
1.4函数的传参数
方法一:sum1 (){ sum=$[$1 +$2] echo $sum}read -p "请输入第一个参数:" num1read -p "请输入第一个参数:" num2sum1 $num1 $num2方法二:sum1 () { sum=$[$1 + $2] echo $sum}sum1 10 20
函数变量的作用范围:
- 函数在shell脚本中仅在当前的shell环境中有效
- shell脚本中函数的变量默认全局有效
- 将变量限定在函数内部使用local命令
[root@localhost opt]# vim demo8.sh#!/bin/bashmyfun(){i=8echo $i}myfun[root@localhost opt]# chmod +x demo8.sh [root@localhost opt]# ./demo8.sh 8------------------------------------------------------[root@localhost opt]# vim demo8.sh#!/bin/bashmyfun(){i=8echo $i}myfunecho $i[root@localhost opt]# ./demo8.sh 88--------------------------------------------------------[root@localhost opt]# cat demo8.sh #!/bin/bashmyfun(){i=8echo $i}i=9myfunecho $i[root@localhost opt]# ./demo8.sh 88---------------------------------------------------[root@localhost opt]# cat demo8.sh #!/bin/bashmyfun(){i=8echo $i}myfuni=9echo $i[root@localhost opt]# ./demo8.sh 89
1.5使用函数文件
我们可以新建一个专门存放函数的文件
[root@localhost data]#vim functions ostype (){ if grep -i -q "linux 6" /etc/os-release then echo "centos6" elif grep -i -q "linux 7" /etc/os-release then echo "centos7" elif grep -i -q "linux 8" /etc/os-release then echo "centos8" elsecolor () {RED="echo -e \E[31m"GREEN="echo -e \E[32m"END="\E[0m"引用时[root@localhost data]#. functions [root@localhost data]#ostype centos7-----------------------------------------------------[root@localhost data]#color[root@localhost data]#${GREEN}MMM$END##会变颜色MMM----------------------------------------------------[root@localhost data]#vim os.sh [root@localhost data]#bash os.sh centos7XXXX-------------------------------------------------------
1.6函数的作用范围
[root@localhost ~]#name=qian[root@localhost ~]#func1 () { name=li ; echo $name; }[root@localhost ~]#func1li[root@localhost ~]#echo $name li[root@localhost ~]#name=qian;func1 () { local name=li ;echo $name; };echo $name#加上local变量即可将变量限制在函数内qian
1.7函数递归
函数调用自己本身的函数
#阶乘:5!表示为:1* 2 * 3 * 4 * 5
用for循环#!/bin/bashsum=1read -p "请输入一个数字:" numfor i in `seq $num`dolet sum=$[i*sum]doneecho $sum函数调用自己#!/bin/bash#fact() {if [ $1 -eq 0 -o $1 -eq 1 ] thenecho 1elseecho $[$1*$(fact $[$1-1])] fi}fact $1
二、数组2.1基础
(1)定义数组格式:
1. 数组名=(value0 value1 value2 value3 ……)
2. 数组名=([0]=value [1]=value1 [2]=value2 ….)
3. 列表名=”value0 value1 value2 value3 …… “
数组名=($列表名)
4. 数组名[0]=”value1″
数组名[1]=”value2″
数组名[2]=”value3″
(2)数组的包括数据类型:
- 数值型
- 字符型
- 混合型数值加字符
注意:使用” “或’ ‘定义单引号或双引号括起来
[root@localhost ~]# a=(1 2 3 4 5) 0 1 2 3 4 [root@localhost ky15]#declare -adeclare -a a='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'[root@localhost ~]# echo ${!a[*]}#查看下标 0 1 2 3 4[root@localhost ~]# echo ${a[0]}#数组的取值 数组加下标1输出第一一个数值 注意是从0开始计算列出所有参数[root@localhost ~]# echo ${a[*]} //*代表所有参数1 2 3 4 5[root@localhost ~]# echo ${a[@]} //@同*1 2 3 4 5共有多少个位置[root@localhost ~]# echo ${#a[@]} //前面加#数组的长度5[root@localhost ~]# echo ${#a[*]} 5#数组分隔[root@localhost ~]# a=(1 2 3 4 5)[root@localhost ky15]#echo ${a[@]:0:5}1 2 3 4 5[root@localhost ky15]#a[1]=9#数组替换[root@localhost ky15]#echo ${a[1]}9[root@localhost ky15]#echo ${a[@]}1 9 3 4 5[root@localhost ky15]#echo ${b[@]/西瓜/葡萄}#只是显示没有真正的修改橘子 香蕉 葡萄[root@localhost ky15]#echo ${b[@]}橘子 香蕉 西瓜[root@localhost ~]#list="1 2 3 4 5"#先定义列表[root@localhost ~]#list1=($list)#再定义数组[root@localhost ~]#echo ${list1[@]}1 2 3 4 5
2.2冒泡排序
1、取出最大数#!/bin/basha=(10 70 30 40 50 60)max=${a[0]}for ((i=0;i<${#a[*]};i++))doif [[ $max -lt ${a[$i+1]} ]]thenmax=${a[$i+1]}fidoneecho $max2、最大数和最小数#!/bin/bashread -p "请输入正整数字,并已空格隔开:" numa=( $num )max=${a[0]}for ((i=0;i<${#a[*]};i++))doif [[ $max -lt ${a[$i+1]} ]]thenmax=${a[$i+1]}fidoneecho "最大值是$max"min=${a[0]}for ((i=0;i<${#a[*]}-1;i++))doif [[ $min -ge ${a[$i+1]} ]]thenmin=${a[$i+1]}fidoneecho "最小值是$min"3、排序算法,冒泡算法a=10b=20对调结果b=10a=20score=(72 63 88 91 45)#第一轮数字大的往后放 第一次 63 72 88 91 45第二次 63 72 88 91 45第三次 63 72 88 91 45第四次 63 72 88 45 91第一轮比较结束 一共比较四次(数组长度减一)最大的数字一定在最后#第二轮数组长度减二 确定了第二大的数字63 72 88 45 9163 72 88 45 91 第一次63 72 88 45 91 第二次63 72 45 88 91 第三次#第三轮数组长度减三 确定了第三大的数63 72 45 88 9163 72 45 88 91 第一次63 45 72 88 91 第二次#第四轮 数组长度减四 确定了第四大的数63 45 72 88 91 45 63 72 88 91 第一次#!/bin/basha=(72 63 88 91 45)#外层为轮次for ((i=1;i<${#a[*]};i++))dofor ((j=0;j<${#a[*]}-i;j++))do if [ ${a[$j]} -gt ${a[`expr $j + 1`]} ] then tmp=${a[`expr $j + 1`]} a[`expr $j + 1`]=${a[$j]} a[$j]=$tmpfidonedoneecho ${a[@]}
2.3调试脚本
set -xread -p "请输入您的分数(0-100):" GRADEif [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]then echo "$GRADE 分!优秀"set +xelif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]thenecho "$GRADE 分,合格"elseecho "$GRADE 分?不合格"fi