shell_脚本练习.sh

shell_脚本练习.sh




shell 练习脚本


脚本00 变量例子
    ping.sh
        #!/bin/bash
        #变量的使用 脚本

        if [ $# -eq 0 ]; then
                echo "paease add ip file"
                echo "usage: `basename $0` file"
                exit
        fi

        if [ ! -f $1 ]; then
                echo "error file"
                exit
        fi

        for ip in `cat $1`
        do
                ping -c1 $ip &>/dev/null
                if [ $? -eq 0 ]; then
                        echo "$ip is up."
                else
                        echo "$ip is down."
                fi
        done


脚本01 删除用户            \\ 使用 if case 判断
    #!/bin/bash
    read -p "please input want delete a user " user
    if [ -z $user ]; then
            echo "can't empty;"
            exit 1
    fi
    id $user >/dev/null 2>&1
    if [ $? -eq 0 ]; then
            :
    else
            echo "no such user $user"       
            exit 2
    fi
    read -p "Are you sure delete $user (Y/N)" i
    case "$i" in
    y|Y|yes|YES)
            userdel -r $user
            echo "delete $user"
            ;;
    *)
            echo "input error can't $user"
            ;;
    esac

    #if [ $i = "y" -o $i = "Y"  ]; then
    #       userdel -r $user
    #       echo "delete $user"
    #else
    #       echo "input error can't $user"
    #       exit 3
    #fi


脚本02 简单的 jump_server
    #!/bin/bash
    #cat <<-EOF >>/home/teo/.bash_profile       \\ 用户级别的 登录执行的文件
    #/home/teo/jump_server.sh
    #EOF
    trap "" HUP INT OUIT TSTP                     \\ trap 信号捕捉  遇到这些信号 不做任何操作 不能退出
    web1=192.168.10.12
    web2=192.168.10.13
    mysql=192.168.10.14
    clear
    while :
    do
    cat <<-EOF                                           \\ 打印菜单
    1. web1
    2. web2
    3. mysql
    EOF
    echo -en "\e[1;35mplease input number: \e[0m"
    read num
    case "$num" in
    1)
            ssh teo@$web1
            ;;
    2)
            ssh teo@$web2
            ;;
    3)
            ssh teo@$mysql
            ;;
    "")
            ;;
    *)
            echo "error"
            ;;
    esac
    done


脚本03 一直ping脚本
    #!/bin/bash
    #ip=192.168.10.$i
    #>a.txt                    # 重定向a.txt  清空a.txt

    while :
    do
            for i in `seq 1 254`
            do
                    {
                    ip=192.168.10.$i
                    ping -c5 $ip &>/dev/null
                    if [ $? -eq 0 ]; then
                            echo -e "\e[1;35m$ip is ok \e[0m" | tee -a a.txt         # tee -a 追加 到a.txt
                    else
                            echo -e "\e[1;31m$ip is donw \e[0m" | tee -a a.txt
                    fi
                    } &                   # 把上面 { } 中的代码后台执行 在子shell中执行
            done
            wait                          # 等待他前面所有的后台进程结束才执行下面的代码
    sleep 10
    done


脚本04 一直ping脚本
    #!/usr/bin/bash
    while :
    do
            for ip in `cat url.txt`
            do
                    {
                    ping -c5 $ip &>/dev/null
                    if [ $? -eq 0 ]; then
                            echo -e "\e[1;35m$ip is up \e[0m"
                    else
                            echo -e "\e[1;31m$ip is down \e[0m"
                    fi
                    } &
            done
            wait
            sleep 120
    done


脚本05 批量创建用户01
    #!/bin/bash
    while :
    do
            read -p "please enter name passwd num " name pass num
            printf "
            ------------------------
            you enter name is $name
            you enter pass is $pass
            you enter num  is $num 
            ------------------------
            "
            read -p "Are you sure[y/n] " action
            if [ "$action" = y ]; then
                    echo "create user now... "
                    break
            fi
    done

    for i in `seq $num`
    do
            id $name$i &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "$user$i already exists"
                    continue                               # 跳出本次循环
            fi
            useradd $name$i
            echo "$pass" | passwd --stdin $name$i >>/dev/null
            echo "$name$i already create"
    done


脚本06 批量创建用户02
    #!/bin/bash
    # ./a.sh url.txt
    # 批量创建用户02 读取url.txt 一行的两个字段 第一字段赋予用户名 第二字段赋予密码
    # user1 123456
    # user2 123456  ... ... url.txt
    #IFS=$'\n'            # 定义for使用回车分隔符 默认空格  两种方式
    IFS='
    '
    for line in `cat $1`
    do
            name=`echo "$line" | awk '{print $1}'`
            pass=`echo "$line" | awk '{print $2}'`
            id $name &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "the $name is already exists."
                    continue
            fi
            useradd $name &>/dev/null
            echo "$pass" | passwd --stdin "$name" &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "the $name is create."
            fi
    done


脚本07 ping检测网段的主机是否存在
    #!/bin/bash
    #使用for
    for i in {1..254}
    do
            {
            ping -c1 -w1 172.21.34.$i &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "$i is up.."
            fi
            } &
    done
    wait
    echo "ping finish all"

    #!/bin/bash
    #使用while
    i=1
    while [ $i -le 254 ]
    do
            {
            ip=172.21.34.$i
            ping -c1 -w1 $ip &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "$ip is up.."
            fi
            }&
            let i++
    done
    wait
    echo "ping finish all...."

    #!/bin/bash
    使用until
    i=1
    until [ $i -gt 254 ]
    do
            {
            ip=172.21.34.$i
            ping -c1 -w1 $ip &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "$ip is up...."
            fi
            }&
            let i++
    done
    wait
    echo "ping finish all .... "


脚本08 1--100相加
    #!/bin/bash
    #使用until循环
    i=1
    until [ $i -gt 100 ]
    do
            let sum+=$i
            let i++
    done
    echo "sum is $sum"
    
    #!/bin/bash
    #使用while循环
    i=1
    while [ $i -le 100 ]
    do
            let sum+=$i
            let i++
    done
    echo "sum is $sum"


    #/bin/bash
    #使用for循环
    for i in {1..100}
    do
    #       let sum=$sum+$i
            let sum+=$i
    done
    echo "sum is $sum"


脚本09 多线程 控制进程的数量
    #!/bin/bash
    # 此脚本为控制多线程的数目 太多会影响机器的性能 命名管道可以多个shell共同使用
    # 利用管理文件的特性 读取一行 会少一行 内容不会覆盖 会追加 来控制 多线程的数目
    thread=5                      #定义多线程 数目为5
    tmp_fifofile=/data/$$.fifo    #定义 自定义命名管道的位置 .fifo管道文件后缀 $$当前进程的pid 仅仅用于名字 其他也可 为了不重复
    mkfifo $tmp_fifofile          #创建 命名管道
    exec 8<> $tmp_fifofile        #打开此管道 使用8描述符打开
    rm -f /data/$$.fifo           #可以不删除 但是会存留  删除了也不影响 已经使用描述符打开
    for i in `seq $thread`        #往管道描述符里面的扔5行文件 这里扔了五个回车 亦可以扔其他的
    do
            echo >&8              #echo 后面什么都没有会 输出一个回车符 >重定向符号 但是管道文件特殊 不会覆盖 会追加
    done                          #&8 为调用 为8的描述符 即 往描述符8的文件 写入回车

    for i in {1..254}
    do
            read -u 8             # -u 从描述符里面读行  这里是从8里面读 读到就继续 读不到就等着读 以此控制多线程数目
            {
            ip=172.21.34.$i
            ping -c1 -w1 $ip &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "$i is up.."
            else
                    echo "$i is down.."
            fi
            echo >&8              # 上面读取一个会少一个  在这里 补充一个
            }&
    done
    wait
    exec 8>&-                     # 释放文件描述符8  循环结束后释放
    echo "ping finish all... ..."


脚本10 expect 解决交互
    #!/usr/bin/expect
    #spawn 开启一个会话 注意解释器 /usr/bin/expect
    #expect 会出现的交互
    #出现yes/no 发送 yes \r回车 ;有可能不出现 跳过
    #出现密码 ;结束标识
    #interact交互 停在对方那边 不退出来 默认是退出
    spawn ssh root@192.168.10.13
    expect {
            "yes/no" { send "yes\r"; exp_continue }
            "password:" { send "123456\r" };
    }
    interact


脚本11 expect 变量的使用及发送命令  
    #!/usr/bin/expect
    #spawn 开启一个会话 注意解释器 /usr/bin/expect
    #expect 定义变量使用sed... [lindex $argv 0] 为位置变量 0表示第1个参数
    #使用 ./i.sh 192.168.10.13 root
    #send 可以发送一些在远程主机执行的命令
    set ip [lindex $argv 0]
    set user [lindex $argv 1]
    set password 123456
    set timeout 5
    spawn ssh $user@$ip
    expect {
            "yes/no" { send "yes\r"; exp_continue }
            "password:" { send "$password\r" };
    }
    #interact
    expect "#"
    send "ip a\r"
    send "pwd\r"
    send "exit\r"
    expect eof


脚本12 expect 主机 推送 公钥 密码一样的情况下
    #!/bin/bash
    #检测主机 如果主机存在则推送
    #expect eof 结束掉expect
    #set timeout 10  设置超时时间
    for i in {2..253}
    do
            {
            ip=192.168.10.$i
            ping -c1 -w1 $ip &>/dev/null
            if [ $? -eq 0 ]; then
                    echo "$ip" >> ip.txt
            /usr/bin/expect <<-EOF
            set timeout 10
            spawn ssh-copy-id $ip
            expect {
                    "yes/no" { send "yes\r"; exp_continue }
                    "password:" { send "123456\r" };
            }
            expect eof
            EOF
            else
                    echo "$ip" >> fale.txt
            fi
            }&
    done
    wait
    echo "all finish... ..."


脚本13 函数的简单使用
    #!/bin/bash
    # 函数计算与 传递参数
    # 1 只定义 调用 计算
    # 2 调用时候 赋值
    # 3 调用时候 传递参数
    mayann(){
    sum=0
    for((i=1;i<=5;i++))
    do
            sum=$[$sum+$i]
    done
    echo "mayann from 1 add 5 is sum $sum.."
    }
    mayann

    katana(){
    sum=0
    for ((n=1;n<=$m;n++))
    do
            sum=$(($sum+$n))
    done
    echo "katana from 1 add $m is sum $sum.."
    }
    m=8
    katana

    janice(){
    sum=0
    for ((i=1;i<=$1;i++))
    do
            let sum=$sum+$i
    done
    echo "janice from 1 add $1 is sum $sum.."
    }

    sssnow(){
    echo "$(($1*$2*$3))"
    }
    result=`sssnow $1 $2 $3`

    janice 10
    janice 20
    janice $1
    janice $2
    janice $3
    echo $result


脚本13 乘法表
    #!/bin/bash
    i=1
    for i in {1..9}
    do
            for ((j=1;j<=i;j++))
            do
                    echo -n "$j*$i=$[$i*$j] "
            done
            echo

    done


脚本14 for取所有的参数 计算
    #!/bin/bash
    # $@或$* 取所有的参数 赋给i
    # for i 后面的也可以省略 意思是 所有的参数 赋给i
    # shift 把参数 向左边 移动一位 删除一位  同 shift 1
    # 1 2 运算
    # 3 创建用户
    for i in $@
    do
            let sum+=$i
    done
    echo "use for sum is  $sum ..."

    while [ $# -ne 0 ]
    do
            let sum+=$1
            shift
    done
    echo "use while sum is  $sum ..."

    while [ $# -ne 0 ]
    do
            useradd $1
            echo "$1 user is create"
            shift
    done


脚本15 打印菜单 select 用法
    #!/bin/bash
    #PS3为系统变量 默认select 调用此变量 如果要修改显示则可以修改
    #PS1 可以 echo $PS1查看
    PS3="--choice--"
    while :
    do
    select i in disk memony cpu quit
    do
            case "$i" in
            disk)
                    df -h
                    break
                    ;;
            memony)
                    free -m
                    break
                    ;;
            cpu)
                    uptime
                    break
                    ;;
            quit)
                    break 2
                    ;;
            *)
                    echo "input error "     
                    break
            esac
    done
    done




    

Teo

You must be logged in to post a comment