封装可重复利用的具有特定功能的代码
作用:简化代码
语句块定义成函数约等于别名,定义函数,再引用函数
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表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:
函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
退出码必须是0-255,超出的值将为除以256取余
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
ip () {
read -p "请输入一个 ip地址:" host
[[ "$host" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || echo "ip 地址是非法的"
}
ip
#!/bin/bash
user () {
if [ $USER = root ]
then echo "这是管理员用户"
else
echo “这不是管理员用户”
return 1
fi
}
user
函数在 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
去nginx官网下载,
nginx.org非盈利组织,开源不一定免费 ,只有新机器才需要安装
#!/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
[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
#!/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
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
索引的编号从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
在另一个脚本界面
[root@localhost ~]#mkdir /data
[root@localhost /]#cd /data
[root@localhost ~]#mv name.txt /data
[root@localhost data]#vim name.txt
read -a 数组名 #交互
输入内容
[root@localhost data03]#read -a num
10 20 30 40 50
[root@localhost data03]#echo ${num[@]}
10 20 30 40 50
declare -a 数组名 #普通数组可以不事先声明,直接使用
declare -A 数组名 #关联数组必须先声明,再使用
②重新复制,改变原有数据
#!/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
#!/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
~