shell六

循环语句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


    

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值