shell脚本之函数

 函数的概念

封装可重复利用的具有特定功能的代码

作用:简化代码

 语句块定义成函数约等于别名,定义函数,再引用函数

基本格式

1.

function 函数名

命令序列

}

2.

函数名(){

命令序列

}

3.

function func_name () {

...函数体...

}

举例

函数使用步骤


①首先是定义函数

②其次是调用函数(注意:若定义完成不调用则函数无效)

③查看系统限制所有函数:declare -F

④查看函数定义详细内容:declare -f  函数名

⑤删除函数 :unset  函数名

函数使用方法:

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

一  查看函数

1 [root@localhost ~]# declare -F
#函数列表


2[root@localhost ~]# declare -f
#函数具体的定义


3判断操作系统版本:
[root@localhost ~]#cat /etc/os-release 


4unset func_name
[root@localhost ~]# dir

 二 函数的返回值

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

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码

  2. 退出码必须是0-255,超出的值将为除以256取余

实验1:建立一个函数文件,判断何种系统

bash mcb.sh
centos
[root@localhost ~]#cat mcb.sh
#!/bin/bash


os ()  {


if grep  -q  centos  /etc/os-release ;then

echo "centos"

elif grep -q  ubuntu   /etc/os-release ;then

echo "ubuntu"

else

echo  "can not support"
fi
}

os

shell脚本之函数_第1张图片

shell脚本之函数_第2张图片 文件中改颜色

shell脚本之函数_第3张图片

shell脚本之函数_第4张图片 小菜一碟

shell脚本之函数_第5张图片

实验2 判断输入IP地址是合法IP地址      return

ip ()  {
read -p "请输入一个  ip地址:"  host
[[  "$host"  =~  ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] ||  echo "ip 地址是非法的"
}
ip

shell脚本之函数_第6张图片

另一种方发 

实验3:判断管理员用户是否可登录 

#!/bin/bash


user () {

if [ $USER = root ]

then echo "这是管理员用户"

else

echo “这不是管理员用户”

return 1

fi

}

user

shell脚本之函数_第7张图片

 三 函数的范围

  • 函数在 shell 脚本中仅在当前 shell 环境中有效

  • shell 脚本中变量默认全局有效

  • 将变量限定在函数内部使用 local 命令

[root@localhost /]#mkdir data2
[root@localhost /]#cd /data2
[root@localhost data2]#name=mcb
[root@localhost data2]#funcl (){ name=mg;echo $name }
mcb
[root@localhost data2]#echo $name
mcb
[root@localhost data2]#funcl (){ local name=mcb;echo $name;}
[root@localhost data2]#funcl
mcb

shell脚本之函数_第8张图片

实验:使用函数一键安装nginx 

去nginx官网下载,

nginx.org非盈利组织,开源不一定免费 ,只有新机器才需要安装

shell脚本之函数_第9张图片

shell脚本之函数_第10张图片 

#!/bin/bash

cpu=`lscpu |grep "CPU(s)"|awk '{print$2}'| head -n1`

read -p "输入安装目录:" dir

cd /data

wget http://nginx.org/download/nginx-1.18.0.tar.gz  &>/dev/null

tar xf nginx-1.18.0.tar.gz

yum  -y  install gcc gcc-c++ pcre-devel openssl-devel zlib-devel openssl openssl-devel   &>/dev/null

cd /data/nginx-1.18.0

./configure --prefix=$dir  &>/dev/null

make -j $cpu &>/dev/null

make instll  &>/dev/null

if [ $? -eq 0 ]

then

echo "安装成功"

else

echo "安装失败"

fi

 

四 for循环相加 ,类似于炸弹

实验:for循环写阶乘

[root@localhost data2]#vim mcb2.sh
[root@localhost data2]#bash mcb2.sh
请输入一个数字:8
40320
[root@localhost data2]#cat mcb2.sh
#!/bin/bash
sum=1

read -p "请输入一个数字:"  num

for i in `seq $num`

do

let sum=$[ i*sum ]

done

echo $sum

shell脚本之函数_第11张图片

实验:也可以用函数表达

#!/bin/bash
fact () {


if [ $1 -eq 1 ]

then

echo 1
else
local temp=$[ $1-1 ]

local result=`fact $temp`

echo "$[$1 * result]"


fi
}
fact $1

shell脚本之函数_第12张图片

 五 数组概念

  • 变量:存储单个元素的内存空间

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

实验:随机点名表

#!/bin/bash

namefile="/data/name.txt"

linenum=$(sed -n '$=' $namefile)

while :
do
clear
tmp=$(sed -n "$[RANDOM%linenum+1]p" $namefile)
echo -e "\033[31m            随机点名(ctrl+c 停止):                  \033[0m"
echo -e "\033[31m####################################################\033[0m"
echo -e "\033[31m##                                                ##\033[0m"
echo -e "\033[31m##                                                ##\033[0m"
echo -e "\033[31m##                     $tmp                       ##\033[0m"
echo -e "\033[31m##                                                ##\033[0m"
echo -e "\033[31m##                                                ##\033[0m"
echo -e "\033[31m####################################################\033[0m"
sleep 0.5

done

shell脚本之函数_第13张图片

在另一个脚本界面 

[root@localhost ~]#mkdir /data

[root@localhost /]#cd /data

 [root@localhost ~]#mv  name.txt /data

[root@localhost data]#vim name.txt
 

shell脚本之函数_第14张图片 

shell脚本之函数_第15张图片 

交互数组


read  -a  数组名   #交互
输入内容
 
[root@localhost data03]#read -a num
10 20 30 40 50
[root@localhost data03]#echo ${num[@]}
10 20 30 40 50

shell脚本之函数_第16张图片

声明数组



declare  -a  数组名     #普通数组可以不事先声明,直接使用


 

declare  -A  数组名      #关联数组必须先声明,再使用

 shell脚本之函数_第17张图片


六 数组的切换

shell脚本之函数_第18张图片

七 数组替换 

① 

②重新复制,改变原有数据

八删除数组 

shell脚本之函数_第19张图片

八 实验:取数组最大值

#!/bin/bash
read -p "请输入数组:"  num

a=($num)

max=${a[0]}

l=${#a[@]}

for ((i=0;i<$l;i++))

do

if [[ $max -lt ${a[ $i+1 ]} ]]

then
max=${a[$i+1]}

fi

done

echo $max

shell脚本之函数_第20张图片

 九 实验:输出最小值/最大值

#!/bin/bash
for i in {0..9}
do

a[$i]=$RANDOM

  [ $i -eq 0 ] &&  min=${a[0]} &&  max=${a[0]}

  [ ${a[$i] } -gt $max ]  &&  max=${a[$i]}
 
  [ ${a[$i] } -lt $min ]  &&  min=${a[$i]}
 

done

echo ${a[@]}

echo max=$max
echo min=$min
~              

shell脚本之函数_第21张图片

冒泡排序

你可能感兴趣的:(linux,服务器,运维)