一、编写一个脚本程序批量创建用户并设置密码
/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