函数与数组
定义函数 命令的集合,用来完成特定的功能; 提前定义函数,在脚本中任意调用函数名。 使用函数使代码模块化,便于重复使用,增加可读性。
函数定义格式:
函数名(){
shell命令
}
或
function 函数名 {
shell命令
}
#定义menu函数内容
menu(){
#定义菜单时,应贴着左侧写
cat << END
1.创建用户
2.删除用户
3.退出程序
END
}
#调用menu
menu
menu(){
cat << END
1.创建用户
2.删除用户
3.退出程序
END
}
input(){
while true
do
read -p "请输入用户前缀:" name
if [[ $name =~ [0-9]+ ]];then
echo "前缀不能包含数字"
continue
fi
break
done
while true
do
read -p "请输入用户数量" num
if [[ $num =~ ^[^0-9]+$ ]];then
echo "数量应为数字"
continue
fi
break
done
}
function create {
input
read -p "将创建${name}1~${name}${num} {y/n}" m
case ${m} in
y)
for i in $(seq $num)
do
user=${name}${i}
id ${user} &> /dev/null
if [ $? -eq 0 ];then
echo "用户:${user}已存在"
else
useradd ${user} &> /dev/null
pass=$(echo $((RANDOM))|md5sum|cut -c 2-10)
echo ${pass}|passwd --stdin ${user} &> /dev/null
echo "用户名:${user} 密码:${pass}" >> /tmp/user.txt
echo "${user}创建成功"
fi
sleep 1
done
;;
n)
;;
*)
echo "输入无效应为 y|n"
create
;;
esac
}
while true
do
menu
read -p "请对菜单进行选择(1-3)" y
case $y in
1)
create
;;
2)
echo 删除用户
;;
3)
;;
*)
echo "选择无效,请选择 1|2|3"
;;
esac
done
小型计算器
fun1(){
case $2 in
+)
echo "$1 + $3=$(( $1 + $3 ))"
;;
-)
echo "$1 - $3=$(( $1 - $3 ))"
;;
x)
echo " $1 * $3=$(( $1 * $3 ))"
;;
/)
echo " $1 / $3=$(( $1 / $3 ))"
;;
*)
echo "只可运算 +|-|x|/"
;;
esac
}
fun1 $1 $2 $3
echo返回任何字符串的结果,用于返回数据
return只能返回1-255 通常用来表示状态,0为成功1为失败
fun1(){
read -p "请输入文件名" name
if [ -f ${name} ];then
return 0
else
return 1
fi
}
fun1
if [ $? -eq 0 ];then
echo " $name 已存在"
else
echo " $name 未找到"
fi
***
pid=$$
fun1(){
ps -ef |grep nginx |grep -v grep |grep -v $pid &> /dev/null
if [ $? -eq 0 ];then
return 0
else
return 1
fi
}
fun1
if [ $? -eq 0 ];then
echo " nginx 运行中"
else
echo " nginx 未运行"
fi
判断nginx是否在运行中
pid=$$
run(){
ps -elf |grep nginx|grep -v $pid &> /dev/null
if [ $? -eq 0 ];then
return 0
else
return 1
fi
}
run && echo "nginx已经运行" || echo "nginx已关闭"
function fun1
{
read -p "请输入一个数字" num
if [ $num -ge 0 -a $num -lt 10 ];
then
return 0
elif [ $num -ge 10 -a $num -lt 20 ];
then
return 1
elif [ $num -ge 20 -a $num -lt 30 ];
then
return 2
else
return 3
fi
}
fun1
echo $?
列出系统中所有用户
cat /etc/passwd|cut -d: -f 1 #-d 指定分割符 -f 指定列
function get
{
list=$( cat /etc/passwd |cut -d: -f 1)
echo $list
}
users=$(get)
n=1
for i in $users
do
echo "第${n}个用户 $i"
let n++
done
库函数
function chk_user
{
if [ $UID -eq 0 ];then
return 0
else
return 1
fi
}
source /sh/function1
chk_user
if [ $? -ne 0 ];then
echo "非管理员无法调用此程序"
fi
case $2 in
+)
result=$(add $1 $3)
echo " $1 + $3 = $result"
;;
-)
result=$(reduce $1 $3)
echo " $1 - $3 = $result"
;;
x)
result=$(multiple $1 $3)
echo " $1 x $3 = $result"
;;
/)
result=$(dev $1 $3)
echo " $1 / $3 = $result"
;;
*)
echo "无效"
;;
esac
数组
可以看成变量,变量一般只能存储一个值,数组可以存储多个值
普通数组:使用数字做索引
关联数组:是哟个字符串做索引 #索引也叫下标
下标:从0开始,元素个数是下一个要往里存的位置
定义数组
names=(张三 李四 王五 陈六) #定义数组,一个空格为隔开一个元素
echo ${names[2]} #[]中为要返回的元素的位置
names[0]=guojing #当这个数组已存在时,更改位置上的数据
echo ${names[@]} #获取数组中所有元素@可换*
echo ${#names[@]} #所有元素的总数
echo ${!names[@]} #获取组中所有元素的索引下标
names[${#names[@]}]=xiangshaolong #利用长度做下标添加元素
#!/bin/bash
names=(zhangsan lisi wangwu chenliu)
index=-1
function list
{
for ((i=0;i<${#names[@]};i++))
do
echo ${names[i]}
done
}
function add
{
read -p "请输入用户名:" name
names[${#names[@]}]=$name
}
function find
{
read -p "请输入用户名:" name
for ((i=0;i<${#names[@]};i++))
do
if [ ${names[$i]} == $name ];then
index=$i
break
fi
done
echo "${index}"
}
function chage
{
i=$(find)
read -p "请输入新的值" new
names[$i]=${new}
list
}
function del
{
i=$(find)
names[$i]=
list
}
while true
do
cat << END
----欢迎使用用户管理系统----
---------1.添加用户---------
---------2.查找用户---------
---------3.修改用户---------
---------4.删除用户---------
-----------5.退出-----------
END
read -p "请选择操作" n
case $n in
1)
list
add
;;
2)
i=$(find)
if [ $i -ne -1 ];then
echo "此用户位于${i}号位"
else
echo "未找到此用户"
fi
;;
3)
change
;;
4)
del
;;
5)
echo "byebye"
break
;;
*)
echo "无效选项"
;;
esac
done
echo ${#str} #返回字符长度
echo ${str:0:7} #截取str中的零到七号字符
例:输入一串字符,将字符逐个放入数组里并输出
read -p "请输入遗传字符串:" chars
for ((i=0;i<${#chars};i++))
do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
例:输入一些数字,找出最大值与最小值,并求出所有数的总和
read -a num -p #定义一个数组num
read -a nums -p "请输入一个数组:"
if [ ${#nums[@]} -lt 2 ];then
echo "数组个数应为两个以上"
fi
for i in ${nums[@]}
do
if [[ ${i} =~ ^[^0-9]+$ ]];then
echo "应为纯数字"
fi
done
max=${nums[0]}
min=${nums[0]}
sum=0
for i in ${nums[@]}
do
let sum+=$i #每次i的值累加到sum变量中
if [ $i -gt $max ];then
max=${i}
fi
if [ $i -lt $min ];then
min=${i}
fi
done
echo "最大值为${max},最小值为${min},累加和为:$sum"
关联数组
declare -A my #声明关联数组
my([id]=1 [name]=zhangsan [age=21]) #给管理数组赋值
my["性别"]=男 #给已有关联数组添加值
echo ${my[id]} #通过索引(键)得出值
#!/bin/bash
declare -A students
students=([id]=1 [name]=zhangsan [age]=19 [score]=90)
for i in ${!students[@]}
do
echo "$i:${students[$i]}"
done
#例:观察80接口状态
#!/bin/bash
declare -A status
while :
do
list=$(ss -an|grep :80|awk '{print $2}')
for i in $list
do
let status[$i]++
done
for a in ${!status[@]}
do
echo "${a}:${status[$a]}"
done
sleep 2
clear
done
#例:统计访问次数与访问状态
#!/bin/bash
declare -A tcps
while read line
do
ips=$(echo $line|awk '{print $1}')
status=$(echo $line|awk '{print $9}')
let tcps[$ips]++
let tcps[$status]++
done < /var/log/nginx/access.log
for i in ${!tcps[@]}
do
echo "${i}:${tcps[$i]}"
done