shell编程练习
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程练习相关的知识,希望对你有一定的参考价值。
第一题:
编写脚本,求100以内所有正奇数之和
答案1:
#!/bin/bash
sum=0
for n in `echo {1..100..2}`;do
sum=$[$sum+$n]
done
echo $sum
答案2:
#!/bin/bash
#编写脚本,求100以内所有正奇数之和
#author : sunxuefeng
#date : 20180213
echo `seq 1 2 100` |tr " " "+" |bc
答案3:
j=0
for i in `seq 1 100 | sed -n '1~2p'`;do
j=$[i+j]
done
echo $j
答案4:
j=0
for i in {1..100};do
if [ $[$i%2] -ne 0 ];then
let j+=i
fi
done
echo $j
第二题:
编写一个脚本能打印9*9乘法表如下:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
……
答案1:
#!/bin/bash
for i in {1..9};do
for j in `seq 1 $i`;do
echo -n -e "$i"X"$j=$[i*j]\t"
done
echo
done
答案2:
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
echo -n "$i*$j=$[$i*$j] "
done
echo
done
答案3:
for i in {1..9}
do
for j in {1..9}
do
if [ ${j} -lt ${i} ]
then
k=$((i * j))
echo -n ${i}*${j}=${k}$'\t'
elif [ ${j} -eq ${i} ]
then
k=$((i * j))
echo ${i}*${j}=${k}
else
break
fi
done
done
第三题:
随机生成一个10以内的数字,然后写一个猜数字的游戏,若输入的值比随机的值大,则提示大,再输入,若小,则提示小,若相等则提示win。
suiji=`echo $[$RANDOM%10]`
while true ;do
read -p "请输入一个10以内的数 : " n
if [ $n -gt 10 ] ;then
echo "你输入数大于10"
break
elif [ $n -gt $suiji ] ;then
echo "输入值大于随机数"
elif [ $n -lt $suiji ] ;then
echo "输入值小于随机数"
elif [ $n -eq $suiji ] ;then
echo "win"
break
fi
done
第四题:
在centos7中编写脚本,自动对/root/httpd-2.4.29.tar.bz2下的文件进行解压、编辑、安装、自动启动服务,自动关闭防火墙。即只要执行脚本后,便可通过浏览器访问本机的ip,看到网页内容为 “春节快乐”。
答案:
tar -xvf /root/httpd-2.4.29.tar.bz2
cd /root/httpd-2.4.29/
./configure --prefix=/app/http29 --sysconfdir=/etc/httpd29
make
make install
/app/http29/bin/apachectl start
echo '<html><body><h1>新年快乐</h1></body></html>' > /app/http29/htdocs/index.html
第五题:
编写一个创建用户的脚本,要求以下功能
a.提示用户输入希望创建的用户名(当用户超时8秒不输入,提示超时并退出)
b.检测用户名是否已存在,若用户不存在,则进入第c步骤,若用户存在则提示用户是否要对该用户设置密码,若用户输入yes、YES、y、Y时则跳至d步骤,如输入其他,或超时8秒均退出。
c.用户创建完成后提示用户是否要继续设置密码,若用户输入yes、YES、y、Y时则继续下一步,如输入其他,或超时8秒均退出。
d.接上一步,为用户设置密码,首先提示用户输入要设置的密码,密码的输入过程不可见。
e.对用户上一步所输入的密码进行长度检测,若少于5位(包含5位),则提示用户密码太短,请重新输入。
f.对用户在第d步所输入的密码进行复杂度检测,若所输入的内容与/usr/share/dict/words 字典中的某一行条目完全一致,则提示密码是一个常见单词,请重新输入。若第e/f两步的密码错误次数一共超过3次,则提示错误次数过多,并退出。
g.再一次让用户输入密码,若第二次输入的密码与在第d步输入的不一致,则提示用户两次密码不一致,请重新输入,则跳回至第d步。
h.d至g步骤全部通过后,为用户设置密码后,并提示密码已成功设置。最后正确退出。
以上的所有退出情况应给出不同的返回值。
答案:
#!/bin/bash
#
changepasswd() {
#密码修改
wrongtime=3
while [ $wrongtime -ne 0 ] ;do
for (( i=4;i>=1;i-- )) ; do
if [ $i -eq 1 ];then
echo "错误次数超过3次";exit 5
fi
#设置密码
read -p "请输入密码 : " -s passwd1
#密码长度检测
if [ $(echo $passwd1|wc -m ) -le 6 ] &> /dev/null ;then
echo "设置密码太短"
continue
fi
#密码复杂度检测
egrep "\b$passwd1\b" /usr/share/dict/words >& /dev/null
if [ $? -eq 0 ] ; then
echo "密码设置为常见单词,请重设置密码"
continue
else
echo
break
fi
done
#确认输入密码
read -p "请确认输入密码 : " -s passwd2
if [ `echo $passwd1` == `echo $passwd2` ];then
echo
echo $passwd1 |passwd --stdin $name &> /dev/null
echo "密码设置成功"
break
else
echo
echo "密码不一致,请重新输入"
wrongtime=$[$wrongtime-1]
continue
fi
done
}
read -t 8 -p "输入希望创建的用户名 :" name
if [ $? -ne 0 ] ;then
echo
echo "用户名输入超时" ;exit 1
fi
#检测用户名是否存在
id $name >& /dev/null
if [ $? -eq 0 ] ; then
read -t 8 -p "用户存在,是否继续设置密码,从yes.YES.y.Y中选择 :" go
else
useradd $name
read -t 8 -p "用户创建成功,是否继续设置密码,从yes.YES.y.Y中选择 :" go
fi
#选择设置密码&&输入密码
if [ $? -ne 0 ] ;then
echo
echo "输入超时" ;exit 2
fi
case $go in
yes|YES|y|Y)changepasswd;;
*)exit 6
esac
exit 0
第六题:
编写一个录入个人信息的脚本/root/bin/information.sh,要求如下:
1.提示用户输入username(需对名字进行字符要求检查,用户名中不能模糊包含系统中任何一个已在存在用户名,如不能为helloroot1,123bin,ggntp2等。且要求username要以大写字母开头,长度至少5个字符。
2.提示用户输入性别,仅能输入male或female,输入其他的提示用户重试。
3.提示用户输入生日,格式必须为yyyy-mm-dd,并对日期的合法性进行检查,若输入2018-02-30等与现实不符的日期,则提示日期错误,请重试。
4.提示用户输入手机号,长度仅能11位,且务必以13x,18x,15x,17x开头,若错误则提示用户重新输入。
5.提示用户输入身份证号,长度可为18位,格式前17位均为数字。要求第7位至第14位所填的内容与第3步的生日符合。同时要求第17位所填的数字若为奇数,那么第2位所填写的性别应为male,反之偶数应为female。最后1位可为数字或x。
6.将以上输入的信息以:为分隔符,保存至/root/info.txt中,每次输入一个用户,会向下追加一行。
如Zhangsan:male:1999-12-20:13588291219:4101011999122030051
答案:
#!/bin/bash
flag=1
while true;do
read -p "请输入用户名 " username
if $(echo "$username" |egrep '^[[:upper:]].{4,}' &> /dev/null) ;then
true
else
echo "请输入首字母大写的高于5位的字符"
continue
fi
for n in `cat /etc/passwd |cut -d: -f1`;do
echo $username| grep $n &> /dev/null
if [ $? -eq 0 ];then
flag=0
break
fi
done
if [ $flag -eq 0 ];then
echo 包含敏感字符
exit 1
else
break
fi
done
#------------------------------------------------------------------------------------------------------------
while true;do
read -p "请输入性别(male,female) " sex
case $sex in
male|female)break;;
*)echo 输错了;continue ;;
esac
done
#---------------------------------------------------------------------
while true;do
read -p "输入生日 " bir
echo $bir|egrep '[[:digit:]]{4}(-[[:digit:]]{1,2}){2}' &> /dev/null
if [ $? -eq 0 ] ;then
biry=$(echo $bir|cut -d- -f1)
birm=$(echo $bir|cut -d- -f2)
bird=$(echo $bir|cut -d- -f3)
if $(cal $bird $birm $biry &> /dev/null) ;then
break
else
echo "不合法"
continue
fi
else
echo 格式不合法
continue
fi
done
#------------------------------------------------------------------------------
while true ;do
read -p "请输入手机号 " num
echo $num |egrep '\<1[3857][[:digit:]]{9}\>' &> /dev/null
if [ $? -eq 0 ];then
break
else
echo "格式不对"
continue
fi
done
#---------------------------------------------------------------------------------
while true ;do
read -p "请输入身份证号 " id
echo $id |egrep '[[:digit:]]{17}[[:digit:]x]' &> /dev/null
if [ $? -eq 0 ];then
biry1=`echo $id |cut -c 7-10`
birm1=`echo $id |cut -c 11-12`
bird1=`echo $id |cut -c 13-14`
if [ $(echo -n $birm|wc -m) -eq 1 ];then
birm=0$birm
fi
if [ $(echo -n $bird|wc -m) -eq 1 ];then
birm=0$bird
fi
if [ "$biry$birm$bird" == $biry1$birm1$bird1 ];then
shu=$[$(echo $id|cut -c 17)%2]
case $shu in
1)xingbie=male
if [ "$xingbie" != "$sex" ];then
echo "性别错了"
continue
else
break
fi;;
*)xingbie=female
if [ "$xingbie" != "$sex" ];then
echo "性别错了"
continue
else
break
fi;;
esac
else
echo "日期不符"
continue
fi
else
echo 格式不对
continue
fi
done
#----------------------------
echo "$username:$sex:$bir:$num:$id">>/app/info.txt
第七题:
利用第六题的脚本,输入20个用户信息。
编写一个抽奖系统的脚本 ,可对/root/info.txt文件中的手机号进行随机抽奖,将中奖的手机号打印出来,要求第4-7位显示为*,即135****1219
答案:
numlist=$(cat -n /app/jobs_20180213_jiaqi/info.txt |wc -l)
randnum=$(echo $[$RANDOM%$numlist+1]) #标记行号是从1开始的,所以随机求余数范围最小是1,最大是numlist -> numli
st-1
sed -n "${randnum}p" /app/jobs_20180213_jiaqi/info.txt |cut -d: -f4 |sed -r "s/\<([[:digit:]]{3}).*([[:digit:
]]{4})\>/\1****\2/"
以上是关于shell编程练习的主要内容,如果未能解决你的问题,请参考以下文章