22-2017-12-18-练习-脚本进阶循环

练习1-分支

1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

#!/bin/bash
#================================================
#FileName   :createuser_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 18:56:27
#Version    :V1.0
#Other      :
#================================================
RED="\033[31m"
YELLOW="\033[0;33m"
RESET="\033[0m"
if [ $# -ne 1 ] ; then
    echo -e "$REDyou must be enter a parameter ,only one!$RESET"
    exit 2
fi

username=$1
id $username &>/dev/null
if [ $? -eq 0 ] ; then
    echo -e "$YELLOW$username has existed !$RESET"
else
    useradd $username &>/dev/null
fi
id $username

2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

case方案:

#!/bin/bash
#================================================
#FileName   :yesorno_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:09:45
#Version    :V1.0
#Other      :
#================================================

read -p "do you agree (yes/no):" choice

case $choice in
[Yy]|[Yy][Ee][Ss])
    echo "you enter a yes"
    ;;
[Nn]|[Nn][Oo])
    echo "you enter is no"
    ;;
*)
    echo "not yes or no "
    ;;
esac

if方案:

#!/bin/bash
#================================================
#FileName   :yesorno2_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:14:14
#Version    :V1.0
#Other      :
#================================================
read -p "do you agree (yes/no):" choice
yes_re="^[Yy]([Ee][Ss])?$"
no_re="^[Nn]([Nn])?$"

if [[ "$choice" =~ $yes_re ]] ; then
    echo  "you enter yes"
elif [[ "$choice" =~ $no_re ]] ; then
    echo "you enter no "
else
    echo "enter not a yes or no "
fi

3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

#!/bin/bash
#================================================
#FileName   :filetype_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:19:42
#Version    :V1.0
#Other      :
#================================================
RED="\033[31m"
YELLOW="\033[0;33m"
RESET="\033[0m"
if [ $# -ne 1 ] ; then
    echo -e "$REDyou must be enter a parameter ,only one!$RESET"
        exit 2
fi

file=$1
type=`ls -ld $file |cut -c 1`
#echo $type
case $type in
    -)
        echo "general file"
        ;;
    d)
        echo "dir"
        ;;
    l)
        echo "link file"
        ;;
    *)
        echo "other"
        ;;
esac

4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数

#!/bin/bash
#================================================
#FileName   :checkint_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:29:08
#Version    :V1.0
#Other      :
#================================================
RED="\033[31m"
YELLOW="\033[0;33m"
RESET="\033[0m"
if [ $# -ne 1 ] ; then
    echo -e "$REDyou must be enter a parameter ,only one!$RESET"
    exit 2
fi

val=$1

int_re="^[0-9]+$"
if [[ $val =~ $int_re ]] ; then
    echo "yes"
else
    echo "no"
fi

练习2-循环

1、判断/var/目录下所有文件的类型

#!/bin/bash
#================================================
#FileName   :test_filetype_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:37:41
#Version    :V1.0
#Other      :
#================================================
dir="/var"
for i in $(ls -1 $dir) ; do
    type=`ls -ld $file |cut -c 1`
    echo -n "$dir/$i===============>"
    case $type in
        -)
            echo "general file"
            ;;
        d)
            echo "dir"
            ;;
        l)
            echo "link"
            ;;
        s)
            echo "socket"
            ;;
        b)
            echo "block"
            ;;
        c)
            echo "character"
            ;;
        *)
            echo "other"
            ;;
    esac
done

2、添加10个用户user1-user10,密码为8位随机字符

#!/bin/bash
#================================================
#FileName   :addusers_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:46:05
#Version    :V1.0
#Other      :
#================================================

for i in `seq 1 10` ; do
        username=user$i
        useradd $username
        echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null
done
echo "finish"

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start

#!/bin/bash
#================================================
#FileName   :test_rcd_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:49:45
#Version    :V1.0
#Other      :
#================================================

for i in `ls -1 /etc/rc.d/rc3.d` ; do
        type=`echo $i | cut -c 1 `
        #echo type
        if [ "$type" == "S" ] ; then
                echo "$i start"
        elif [ "$type" == "K" ] ; then
                echo "$i stop"
        else
                echo "$i unkown"
        fi
done

4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

#!/bin/bash
#================================================
#FileName   :test_sum_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 19:55:12
#Version    :V1.0
#Other      :
#================================================
if [ $# -ne 1 ] ; then
        echo "must enter a parameter ,only one "
        exit 2
fi
n=$1
digit_re="^[0-9]+$"
if [[ ! $n =~ $digit_re ]] ; then
        echo "not a digit, must a digit"
        exit 3
fi
declare -i sum=0
for i in `seq 1 $n` ; do
        sum+=$i
done
echo $sum

5、计算100以内所有能被3整除的整数之和

#!/bin/bash
#================================================
#FileName   :test_sum_3_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 20:03:09
#Version    :V1.0
#Other      :
#================================================
declare -i sum=0
for i in `seq 1 100` ; do
        if [ $[i%3] -eq 0 ] ; then
                sum+=$i
        fi
done
echo $sum

sum=0
for i in `seq 3 3 100` ; do
        sum+=$i
done
echo $sum

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

#!/bin/bash
#================================================
#FileName   :test_ip_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 20:06:22
#Version    :V1.0
#Other      :
#================================================

read -p "enter you network (like 172.18.0.0) :" network
ip_re_1="(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))"
ip_re="$ip_re_1(\.$ip_re_1){3}"
#echo $ip_re

if [[ ! "$network" =~ $ip_re ]]  ; then
        echo  " not a ip "
        exit 2
fi

net=` echo $network |cut -d "." -f 1-3`
#echo $net
for i in `seq 1 254` ; do
        {
                ip=$net.$i
                ping -c 1 -W 2 $ip &>/dev/null
                if [ $? -eq 0 ] ; then
                        echo $ip up
                else
                        echo $ip down
                fi
        }&
done
wait

7、打印九九乘法表

#!/bin/bash
#================================================
#FileName   :test_99_table_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 20:24:27
#Version    :V1.0
#Other      :
#================================================

num=9

for i in `seq 1 9` ; do
        for j in `seq 1 $i`; do
                echo -ne "$j*$i=$[j*i]\t"
        done
        echo
done

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html

#!/bin/bash
#================================================
#FileName   :test_make_html_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 20:27:50
#Version    :V1.0
#Other      :
#================================================
dir=/testdir
if [ ! -d $dir ] ; then
        mkdir -pv $dir &>/dev/null
fi
for i in `seq 1 10` ; do
        tmp=`openssl rand -base64 10  ||sed -rn "s@[^[:alpha:]]@@gp"|head -c 8`
        touch $dir/$i$tmp.html
done

9、打印等腰三角形

#!/bin/bash
#================================================
#FileName   :test_trangle_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 20:36:51
#Version    :V1.0
#Other      :
#================================================
line=5
for i in `seq 1 $line` ; do
        len=$[2*line+1]
        for j in `seq 1 $len` ; do
                if [ $j -le $[line-i] -o $j -ge $[line+i] ] ; then
                        echo -n " "
                else
                        echo -n "*"
                fi
        done
        echo
done

10、打印国际象棋

#!/bin/bash
#================================================
#FileName   :test_guojixiangqi_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-18 20:46:43
#Version    :V1.0
#Other      :
#================================================

line=8
line2=$[line*2]
for i in `seq 1 8 ` ; do
    for j in `seq 1 $line2 ` ; do
        if [ $[i%2] -eq 1 ] ; then
            if [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; then
                echo -ne "\033[41m \033[0m"
            else
                echo -ne "\033[42m \033[0m"
            fi
        else
            if [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; then
                echo -ne "\033[42m \033[0m"
            else
                echo -ne "\033[41m \033[0m"
            fi
        fi
    done
    echo
done

练习3-while1

1、编写脚本,求100以内所有正奇数之和


2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少


3、编写脚本,打印九九乘法表


4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值


5、编写脚本,实现打印国际象棋棋盘


6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo $RANDOM|md5sum|cut –c1-10后的结果,请破解这些字符串对应的RANDOM值

练习4-while2

1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本


2、随机生成32767以内的数字,实现猜字游戏,提示比较大小,并给出提示范围,相等则退出

#!/bin/bash
#================================================
#FileName   :guess_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:运行是比较简单的,不用猜,一路回车就可以了。
#DateTime   :2017-12-22 10:45:57
#Version    :V1.0
#Other      :
#================================================

declare -i val=$RANDOM


declare -i start=0
declare -i end=32767
declare -i mid=$[(start+end)/2]
#echo $val
#echo $mid
#echo "you val is $val"

while true; do
        read -p "pleater you guesss val[${start}-${end}],default($mid)  " guess
        if [ -z  $guess ] ; then
                guess=$mid
        fi
        if [ "$guess" -eq "$val" ] ; then
                mid=$guess
                break
        elif [ "$guess" -lt "$val" ] ; then
                start=$[guess+1]
        elif [ "$guess" -gt "$val" ] ; then
                end=$[guess-1]
        else
                true
        fi
        mid=$[(start+end)/2]
done

3、用文件名做为参数,统计所有参数文件的总行数


4、用二个以上的数字为参数,显示其中的最大值和最小值


5、扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。


练习5-select

1、使用select 做yes,no的判断

#!/bin/bash
#================================================
#FileName   :test_select_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-23 10:15:57
#Version    :V1.0
#Other      :
#================================================

select c in yes no ; do
        echo " you enter is $c"
        case $c in
                yes)
                        echo "yes";;
                no)
                        echo "no";;
                *)
                        echo "other";;
        esac
done

2、使用for(())方式来计算1到100直接能被3整出的数之和

#!/bin/bash
#================================================
#FileName   :test_for_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-23 10:33:25
#Version    :V1.0
#Other      :
#================================================
declare -i sum=0
for (( i=3 ; i<=100; i+=3)); do
        sum+=i
done
echo "sum:"$sum

3、trap的使用

#!/bin/bash
#================================================
#FileName   :test_trap_46_zhaojiedi.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2017-12-23 11:11:47
#Version    :V1.0
#Other      :
#================================================
f2(){
        trap '-' SIGINT
        echo "            trap int cancel"
}

f1(){
        echo "                 trap int ,you can ctrl +c to cancel"
        trap 'f2' SIGINT
}
trap 'f1 ' SIGINT

for i in `seq 1 100` ; do
        echo $i
        sleep 2
done