04.第三次练习:Shell脚本

一、编写一个脚本程序批量创建用户并设置密码

/root目录下创建一个user.txt的文件,文件内容如下:
tom:tom123456
gordon:789gordon
dolores:westworld
创建完该文件后,编写一个脚本程序,创建用户,用户名和密码分别是":"左右的内容。

#!/bin/bash
#使用逐行读入循环进行处理
while read line;do
    #1.循环输出$line变量,验证while read line 结构和文本文件user.txt 是否正确
    echo $line

    #2.获取每行中的userName和Password内容,并输出验证一下。
    userName=`echo $line | cut -d: -f1`
    userPassword=`echo $line | cut -d: -f2`
    userPassword=${line#*:}
    userName=${line%:*}

    #3.根据userName 和userPassword 创建用户和密码
    echo $userName $userPassword
    useradd $userName &>/dev/null
    echo "$userPassword" | passwd --stdin "$userName" &>/dev/null

done < /root/user.txt

二、编写一个脚本统计一下 /dev/下每种文件类型的文件分别有多少个,将结果打印出来。

#!/bin/bash
#1.参数整理
dirPath=$1

#2.初始化空数组保存每种文件的个数
fileTypeArray=("0" "0" "0" "0" "0" "0" "0" "0")

#3.循环处理每一个文件,根据第一个字符判断文件类型,并在对应的数组位置计数加1
for fName in $dirPath/*;do
    fType=`ls -dl $fName | cut -b 1`    
    fileTypeArray[7]=$(( ${fileTypeArray[7]}+1 ))

    #使用test进行文件类型判断 -f , -d, -b, -h, -S, -p,-c 也不错
    case $fType in
        "-")
            fileTypeArray[0]=$(( ${fileTypeArray[0]}+1 ))
            ;;
        "d")
            fileTypeArray[1]=$(( ${fileTypeArray[1]}+1 ))
            ;;
        "l")
            fileTypeArray[2]=$(( ${fileTypeArray[2]}+1 ))
            ;;
        "c")
            fileTypeArray[3]=$(( ${fileTypeArray[3]}+1 ))
            ;;      
        "s")
            fileTypeArray[4]=$(( ${fileTypeArray[4]}+1 ))
            ;;
        "b")
            fileTypeArray[5]=$(( ${fileTypeArray[5]}+1 ))
            ;;          
        "p")
            fileTypeArray[6]=$(( ${fileTypeArray[6]}+1 ))
            ;;  
    esac
done

#4.输出对应的统计信息
echo $dir "下总共包含文件:" ${fileTypeArray[7]}
echo "普通文件有  :" ${fileTypeArray[0]}
echo "目录文件有  :" ${fileTypeArray[1]}
echo "链接文件有  :" ${fileTypeArray[2]}
echo "字符设备有  :" ${fileTypeArray[3]}
echo "套接字文件有:" ${fileTypeArray[4]}
echo "块设备有    :" ${fileTypeArray[5]}
echo "管道文件有  :" ${fileTypeArray[6]}

三、编写一个脚本可以打印出99乘法表,要求用最简单,最好记忆的实现算法实现。

#!/bin/bash
#1.外层循环一共9行
for i in {1..9};do
    #2.内层循环,内层循环不能超过当前外部循环的值
    for j in `seq $i`;do
        echo -en "$j*$i=$(($i*$j))\t"
    done
    #3.打印换行
    echo
done

四、编写一个脚本,实现猜数字功能(数字为9到199的随机数)。程序运行后提示输入一个数字,若输入的数字和随机数一样,则提示猜数字成功,结束程序;若输入的数字和随机数不一样,则提示大于或者小于随机数,并要求再次猜数。若进行10次猜数还没猜出结果,提示游戏结束,结束脚本。并打印出正确的随机数。

#!/bin/bash

#1.生成一个9到199的随机数
rand=$(( $RANDOM%191+9 ))
echo $rand

#2.循环执行10次输入和判断,判断正确提前结束游戏。
for i in {1..10};do
    read -p "please input a num: " cliNum

    #3.判断输入的是否是数字,是否大于8,满足条件才进行判断
    if [ $cliNum -gt 8 ] 2>/dev/null ;then

        #4.内层条件判断:判断数的大小
        if [ $rand -gt $cliNum ] ;then 
            echo "you should input a large number !"
        elif [ $rand -lt $cliNum ];then
            echo "you should input a small number !"
        else 
            echo "winner !!!!"
            break
        fi

    #5.排除错误字符的输入
    else
        echo "your input is error !"
    fi

done

echo "game over ! winner num is $rand"

五、使用脚本打印出如下图形

  *
 **
***
   ***
   **
   *

1、方法一:

#!/bin/bash
#1.接受一个参数为星星的个数。
num=$1

#2.求出总共要打印的行数
let lines=num*2

#3.for 循环处理每一行的数据
for i in `seq $lines`;do
    #4.前半个星星处理逻辑
    if [ $i -le $num ];then
        for j in `seq $(( $num-$i))`;do
            echo -n " "
        done
        for j in `seq $i`;do
            echo -n "*"
        done
        echo ""
  
    #5.后半个星星的处理逻辑 
    else
        for j in `seq $num`;do
            echo -n " "
        done
        for j in `seq $(( $lines-$i+1 ))`;do
            echo -n "*"
        done
            echo ""
    fi

done

2、方法二:

read -p "Input a number : " i
#var=$[i*2-1]
declare -i m=1
declare -i ln=xn=$[i*2]
declare -i sn=$[i-1]
#declare -i n=1

#一共ln行,
for j in `seq $ln` ;do
    if [ $j -le $[ln/2] ]; then     #判断上半部分还是下半部分
        for n in `seq $[i-1]` ;do     #每行的空格数
            echo -e " \c";
        done
        for m in `seq $m` ;do       #每行的*数
            echo -e "*\c";
        done
        echo
        m+=1
        i=$[i-1]
        continue

    else
        for s in `seq $sn` ;do      #下半部分每行之前的空格数
            echo -e " \c";
        done
        for x in `seq $[xn/2]` ;do    #下半部分每行的*数
            echo -e "*\c";
        done
        echo
        xn=$[xn-2]
    fi

done

六、递归练习,打印出200以内的斐波那契数列。

1、方法一:

#!/bin/bash

#1.创建斐波那契函数
function fib(){
    #2.初始化接收到的参数
    temp=$1

    #3.前连个值都为1
    if [ $temp -le 2 ];then
        echo 1
        #4.一定要有返回值,要不就死循环了。
        return 
    fi

    #4.如果不是前两个值,进行计算求值  
    v1=`fib $(( temp-1 ))`
    v2=`fib $(( temp-2 ))`
    echo $((v1+v2))
}

fib $1

#5.输出对应长度的斐波那契数列
for i in `seq $1`;do
    fib $i

done

2、方法二(数组非递归):

#!/bin/bash

#1.传入一个数列长度
read -p "Please input a number (If number is too large , the result will be wrong ):" i

#2.定义一个数组存放对应数列的值
declare -a sl
sl[0]=0
sl[1]=1
sl[2]=1

#3.前两数直接输出
if [ $i -lt 3 ];then
    echo ${sl[*]}

#4.其他数值循环遍历生成,存放于数组中
else
    for i in `eval seq 3 $i`; do
        let sl[$i]=${sl[$i-1]}+${sl[$i-2]}
    done
fi

#5.打印数组
len=${#sl[*]}
for i in `seq 1 $(( len-1 ))`;do
    echo -n "${sl[$i]} "
done
echo ""

七、编写一个脚本,测试一下172.20 教室 哪些主机可以ping通。并将ip地址按升序打印出来。

#!/bin/bash


#1.循环生成ip地址
for i in `seq 0 255`; do

    #2.ping对应地址并将ping程序转为后台运行。
    for n in `seq 1 30`; do
        ping -c 1 -w 1 172.20.$i.$n > /dev/null && echo "Host 172.20.$i.$n is up" >> /tmp/p.txt &
        #睡一会,0.001秒
        sleep 0.001
    done

done

#3.处理成功的ip地址
cat /tmp/p.txt | cut -d " " -f2 

rm -rf /tmp/p.txt

猜你喜欢

转载自www.cnblogs.com/GymUManAlvin/p/9058240.html