2.8. 2017-12-18-练习-脚本进阶循环¶
2.8.1. 练习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.8.2. 练习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
2.8.3. 练习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值
2.8.4. 练习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信息修改成功。
2.8.5. 练习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