循环语句while
只要条件成立就反复执行命令,直到命令不成立
案例1:命令基本格式
无限循环
vim while1.sh
#!/bin/bash
while true
do
echo hehe
done
设定限制
vim while1.sh
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo hehe
let i++
done
案例2:输出10~1的降序两列,并得出和
vim while2.sh
#!/bin/bash
i=10
while [ $i -gt 0 ]
do
sum=$(( $i + $i ))
echo $i + $i = $sum
let i--
done
案例3:输出10的升序和降序之和
vim while3.sh
#!/bin/bash
a=1
b=10
while [ $a -le 10 ]
do
sum=$(( $a + $b ))
echo $a + $b = $sum
let a++
let b--
done
案例4:批量创建用户
vim while4.sh
#!/bin/bash
while read user
do
id $user &> /dev/null
if [ $? -eq 0 ];then
echo "useradd: $user already exsits"
else
useradd $user &> /dev/null
echo "user:$user create successful"
fi
echo $user
sleep 1
done<user.txt
------------------------------------
内置跳出循环命令
exit 跳出脚本,剩余代码都不执行
break 跳出循环,会执行循环后的代码
continue 结束本次循环,继续下次循环,包括循环后代码
案例1:exit
vim test1.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
exit
echo "456"
done
echo "done..."
案例2:break
vim test2.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
break
echo "456"
done
echo "done..."
案例3:continue
vim test3.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
continue
echo "456"
done
echo "done..."
函数与数组
函数 function
定义函数
命令的集合,用来完成特定的功能;
提前定义函数,在脚本中任意调用函数名。
使用函数使代码模块化,便于重复使用,增加可读性。
函数定义格式:
函数名(){
shell命令
}
或
function 函数名 {
shell命令
}
案例1:定义函数并通过函数名直接调用执行
vim fun1.sh
#!/bin/bash
fun1(){
echo "这是第一种定义函数的方法"
}
function fun2 {
echo "这是第二种定义函数的方法"
}
fun1
fun2
案例2:函数的传参,位置变量
vim fun2.sh
#!/bin/bash
fun1(){
echo "hello $1"
}
function fun2 {
echo "hello $*"
}
fun1 $1
fun2 $*
案例3:函数的传参,变量传递固定值
vim fun3.sh
#!/bin/bash
fun1(){
echo "$i"
}
i=100
fun1
案例4:函数的传参,变量传递可变值
vim fun4.sh
#!/bin/bash
fun1(){
echo "$i"
}
i=$1
fun1
案例5:多值传参
vim fun5.sh
#!/bin/bash
fun1(){
echo "$1"
}
fun1 $1
fun1 $2
fun1 $3
或
vim fun5.sh
#!/bin/bash
fun1(){
echo "$1" "$2" "$3"
}
fun1 $1 $2 $3
zh=$(fun1 $1 $2 $3)
echo "传参的值:$zh"
案例6:多值传参计算 **
vim fun6.sh
#!/bin/bash
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 ))
;;
esac
}
fun1 $1 $2 $3
案例7:函数状态返回值echo、return
echo可以返回任何字符串结果,用于返回数据;
return只能返回1-255的整数值,通常用来表示状态:0成功、1失败
vim fun7.sh
#!/bin/bash
fun1(){
echo 100
return 1
}
result=$(fun1)
echo "函数的状态码是:$?"
echo "函数的返回值是:$result"
案例8:函数return返回值
vim fun8-1.sh
#!/bin/bash
file=/etc/passwd
fun1(){
if [ -f $file ];then
return 0
else
return 1
fi
}
fun1
if [ $? -eq 0 ];then
echo "$file 文件存在"
else
echo "$file 文件不存在"
fi
vim fun8-2.sh ***
#!/bin/bash
pid=$$
nginx_run(){
ps -ef |grep nginx |grep -v grep |grep -v $pid &> /dev/null
if [ $? -eq 0 ];then
return 0
else
return 1
fi
}
nginx_run && echo "nginx is running" || echo "nginx is stopped"
案例9:输入的数值判断并返回相应值
要求:0-10返回0,10-20返回1,20-30返回2,其他返回3.
vim fun9.sh
#!/bin/bash
num(){
read -p "请输入对应的数字:" sz
if [ $sz -ge 0 -a $sz -lt 10 ];then
return 0
elif [ $sz -ge 10 -a $sz -lt 20 ];then
return 1
elif [ $sz -ge 20 -a $sz -lt 30 ];then
return 2
else
return 3
fi
}
num
echo $?
案例10:列出系统所有用户 **
vim fun10.sh
#!/bin/bash
function get_users
{
users=`cat /etc/passwd | cut -d: -f1`
echo $users
}
user_list=`get_users`
i=1
for u in $user_list
do
echo "The $index user is : $u"
let i++
done
案例11:函数库调用
vim /root/base_function
function add
{
echo "`expr $1 + $2`"
}
function reduce
{
echo "`expr $1 - $2`"
}
function multiple
{
echo "`expr $1 \* $2`"
}
function divide
{
echo "`expr $1 / $2`"
}
function sys_load
{
echo "cpu load"
echo
sar -u
echo
echo "memory info"
echo
sar -r
echo
echo "disk usage"
echo
sar -B
echo
}
vim fun11.sh
#!/bin/bash
. /root/base_function
add 10 20
reduce 90 30
multiple 12 12
divide 12 2
sys_load
------------------------------------
数组 array
1.数组的概念
可以看成变量,变量一般只能存储一个值,数组可以存储多个值。
2.数组的分类
普通数组:使用数字做索引
关联数组:使用字符串做索引
索引也叫下标
3.普通数组和关联数组的定义使用
普通数组:
kc=(linux基础 架构 mysql docker k8s)
echo ${kc}
echo ${kc[0]}
echo ${kc[1]}
echo ${kc[@]} 获取数组中的所有元素
echo ${kc[*]}
echo ${#kc[@]} 获取数组中的所有元素总数
echo ${!kc[@]} 获取数组中所有元数的索引下标
关联数组:
declare -A my 声明关联数组
my=([id]=1 [name]=zhangsan [age]=21) 给关联数组赋值
my["性别"]=男 给已有关联数组添加值
echo ${my[id]} 通过关联索引(键)得出值
案例1:将字符串里的字符逐个放入数组,并将输出到标椎输出
vim shuzu2.sh
#!/bin/bash
read -p "请输入一串字符串:" chars
for ((i=0;i<=${#chars};i++))
do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
案例2:输入一些数,将这些数的最大最小找出,并求出所有数的和
vim shuzu2.sh
#!/bin/bash
read -a num -p "请输入一些整数:"
if [ ${#num[@]} -lt 2 ];then
echo "至少应该输入两个整数以上..."
exit
fi
for i in ${num[@]}
do
if [[ ! $i =~ ^[0-9]+$ ]];then
echo "输入错误,请重新输入"
exit
fi
done
echo ${num[@]} | sort -nr
max=${num[0]}
min=${num[0]}
for i in ${num[@]}
do
let sum+=i
if [ $i -gt $max ];then
max=$i
fi
if [ $i -lt $min ];then
min=$i
fi
done
echo "sum=$sum,max=$max,min=$min"
案例3:数组定义菜单
vim shuzu2.sh
#!/bin/bash
MENU_EXPLAIN=(
"退出" "状态" "更新" "回滚" "重启" "停止" "免密" "日志" "资源" "登陆"
)
MENU_LIST=(
"exit" "status" "update" "roollback" "restart" "stop" "SEND_KEY" "log" "mem_disk" "ssh_login"
)
main(){
clear
ARRAY_NUM_MENU_LIST=${#MENU_EXPLAIN[*]}
ARRAY_NUM=$(expr $ARRAY_NUM_MENU_LIST - 1)
while true
do
echo -e "主菜单操作:"
for I_MENU_LIST in ${!MENU_EXPLAIN[@]}
do
echo -e " ${MENU_EXPLAIN[${I_MENU_LIST}]} -----> $I_MENU_LIST"
done
read -p "选择要执行的操作:" NUM_MENU_LIST
if [ "$NUM_MENU_LIST" = 0 ];then
exit
elif [[ "$NUM_MENU_LIST" =~ ^[0-9]+$ ]] && [ ${NUM_MENU_LIST} -le ${ARRAY_NUM} ];then
clear
${MENU_LIST[${NUM_MENU_LIST}]}
else
clear
echo "输入0-${ARRAY_NUM_MENU_LIST}的数字"
fi
done
}
main
案例4:统计网站的所有连接状态以及数量
vim shuzu4.sh **
#!/bin/bash
declare -A status
while :
do
type=$(ss -an |grep :80|awk '{print $2}')
for i in $type
do
let status[$i]++
done
for j in ${!status[@]}
do
echo "$j:${status[$j]}"
done
sleep 2
clear
done
案例5:统计网站的ip访问数量
cat /var/log/nginx/access.log | awk '{print $1}'
cat /var/log/nginx/access.log | awk '{print $9}'
vim shuzu6.sh **
#!/bin/bash
declare -A tcps
while read line
do
type=$(echo $line | awk '{print $1}')
if [ ! ${#type} -eq 0 ];then
type2=$(echo $line |awk '{print $9}')
let tcps[$type]++
let tcps[$type2]++
fi
done</var/log/nginx/access.log
for i in ${!tcps[@]}
do
echo "$i:${tcps[$i]}"
done