一、函数

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决
语句块定义成函数约等于别名
函数使用方法:

  • 定义函数
  • 再引用函数
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