Shell脚本4

一、函数

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

  • 定义函数
  • 再引用函数
1.

function 函数名{ 
    命令序列
}

2.
函数名(){

命令序列

}

3.

function func_name () {

 ...函数体...

} 

注意事项:

  • 直接写函数中调用函数 直接写函数名
  • 同名函数后一个生效
  • 调用函数一定要先定义
  • 只要先定义了调用的 其他函数定义顺序无关
func_name (){
...函数体...
}

一、定义函数:

[root@localhost data]#func1 (){ hostname;date;}
1、定义函数
[root@localhost data]#func1
2、调用函数
localhost.localdomain
2021年 10月 23日 星期六 10:23:50 CST

3、注意调用的位置
h () {

echo "hello"

}
nihao () {
echo `h`  `w`

}

w () {
echo "world"
}

nihao


####
同名函数

1.1查看函数

[root@localhost ~]# declare -F
#函数列表
declare -f __HOSTNAME
declare -f __SIZE
declare -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 ~]# dir
anaconda-ks.cfg       pricegame.sh  sum.sh  公共  视频    文档  音乐
initial-setup-ks.cfg  sum1.sh        yum.sh  模板  图片    下载  桌面

1.3函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:

  • 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  • 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        return $[$num*2]

}

test1
echo $?

怎么解决超过 255

#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        echo $[$num*2]

}

result=`test1`
echo $result
return 的用法:

user () {
if  [ $USER = root ] 
then
echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi

}

1.4函数的传参数

方法一:
sum1 (){
    sum=$[$1 +$2]
    echo $sum
}

read -p "请输入第一个参数:" num1
read -p "请输入第一个参数:" num2
sum1 $num1 $num2

方法二:
sum1 () {
        sum=$[$1 + $2]
        echo $sum
}
sum1 10 20

函数变量的作用范围:

  • 函数在shell脚本中仅在当前的shell环境中有效
  • shell脚本中函数的变量默认全局有效
  • 将变量限定在函数内部使用local命令
[root@localhost opt]# vim demo8.sh
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun

[root@localhost opt]# chmod +x demo8.sh 
[root@localhost opt]# ./demo8.sh 
8
------------------------------------------------------
[root@localhost opt]# vim demo8.sh
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun
echo $i

[root@localhost opt]# ./demo8.sh 
8
8
--------------------------------------------------------

[root@localhost opt]# cat demo8.sh 
#!/bin/bash
myfun(){
i=8
echo $i

}
i=9
myfun

echo $i
[root@localhost opt]# ./demo8.sh 
8
8
---------------------------------------------------

[root@localhost opt]# cat demo8.sh 
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun
i=9
echo $i

[root@localhost opt]# ./demo8.sh 
8
9

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"
  else

color () {
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 
centos7
XXXX
-------------------------------------------------------

1.6函数的作用范围

[root@localhost ~]#name=qian
[root@localhost ~]#func1 () { name=li ; echo $name; }
[root@localhost ~]#func1
li
[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/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum

函数调用自己
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ] 
then
echo 1
else
echo $[$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 -a
declare -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/bash
a=(10 70 30 40 50 60)
max=${a[0]}
for ((i=0;i<${#a[*]};i++))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done
echo $max

2、最大数和最小数
#!/bin/bash
read -p "请输入正整数字,并已空格隔开:" num
a=( $num )

max=${a[0]}
for ((i=0;i<${#a[*]};i++))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done
echo "最大值是$max"

min=${a[0]}
for ((i=0;i<${#a[*]}-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo "最小值是$min"



3、排序算法,冒泡算法
a=10
b=20

对调结果
b=10
a=20

score=(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  91
63 72 88 45  91 第一次
63 72 88 45  91 第二次
63 72 45 88  91 第三次

#第三轮数组长度减三  确定了第三大的数
63 72 45  88  91
63 72 45  88  91 第一次
63 45 72  88  91 第二次

#第四轮  数组长度减四  确定了第四大的数
63 45  72  88  91  
45 63  72  88   91 第一次



#!/bin/bash
a=(72 63 88 91 45)
#外层为轮次
for ((i=1;i<${#a[*]};i++))
do
for ((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]=$tmp
fi
done
done
echo ${a[@]}

2.3调试脚本

set -x
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then echo "$GRADE 分!优秀"
set +x
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,合格"
else
echo "$GRADE 分?不合格"
fi
posted @ 2022-12-23 18:18  崧蓝  阅读(50)  评论(0编辑  收藏  举报