一、编写一个倒计时脚本,例如输入1:10这样的时间后,继续以分:秒的形式倒数,当没有输入或时间格式不对时报错。
#!/bin/bash
MIN=`echo $1 | awk -F : '{print $1}'`
SEC=`echo $1 | awk -F : '{print $2}'`
if [ -z "$1" ]
then
echo "Error : Please input a time !!!"
elif [ -z "$MIN" -o -z "$SEC" ]
then
echo "Error : The time format is wrong !!!"
elif [ "$MIN" = "0" -a "$SEC" = "0" ]
then
echo " Warning : The time is over !!! "
elif [ "$SEC" != "0" ]
then
All_Sec=$[$MIN*60+$SEC]
for ((All_Sec=$[$MIN*60+$SEC];All_Sec>=0;All_Sec--))
do
MIN=$[All_Sec/60]
SEC=$[All_Sec%60]
echo -ne "The countdown ends in $MIN:$SEC time!!!\r"
sleep 1
if [ "$MIN" = "0" -a "$SEC" = "0" ]
then
echo " Warning : The time is over !!! "
fi
done
fi
二、编写一个交互式的用户建立脚本,且执行脚本后可以看到[C]reate [D]elete [E]xit
,根据输入不同的选项来创建和删除用户,且创建和删除完成后回到最初的选项位置,只有E选项才能退出,并且创建用户时可以指定密码,当用户存在时会有提示。
#!/bin/bash
echo -e "[C]reate [D]elete [E]xit\n" ##\n表示下一行,并没有别的特殊含义
Choose_Action_Func()
{
read -p "Please input Action : " WORD
ACTION=`echo "$WORD" |tr 'A-Z' 'a-z'` ##把大写字母转换成小写字母,提高可执行性
[ "$ACTION" = "c" -o "$ACTION" = "create" ] && {
Create_User_Func
}
[ "$ACTION" = "d" -o "$ACTION" = "delete" ] && {
Delete_User_Func
}
[ "$ACTION" = "e" -o "$ACTION" = "exit" ] && {
echo $ACTION
exit
}||{
echo "Error: $ACTION is wrong action !!" ##当输入的操作不是3个选项时,报错
Choose_Action_Func
}
Choose_Action_Func
}
Create_User_Func()
{
read -p "Please input username: " USERNAME
id $USERNAME &> /dev/null
[ "$?" = "0" ] && { ##$=0时表示没有错误输出
echo $USERNAME is exist!!
Choose_Action_Func ##用户存在时也表示目的达成,返回初始选择界面
}||{
useradd $USERNAME
read -p "Please input password: " PASS
echo $PASS | passwd --stdin $USERNAME &> /dev/null ##给建立的用户指定密码
echo "$USERNAME is created!!"
Choose_Action_Func
}
}
Delete_User_Func()
{
read -p "Please input username: " USERNAME
id $USERNAME &> /dev/null
[ "$?" = "0" ] && {
userdel -r $USERNAME
echo $USERNAME is deleted
Choose_Action_Func
}||{
echo "$USERNAME is not exist!!" ##删除的用户不存在时也表示目的达成,因为本来就想删掉,所以回到初始界面
Choose_Action_Func
}
}
Choose_Action_Func
三、编写一个脚本,执行脚本后尝试连接10台主机,看能否ping通,并把可以ping通的主机ip显示出来。
#!/bin/bash
for IP in {1..10}
do
ping -c1 -w1 172.25.254.$IP &> /dev/null ##通过循环语句一个个尝试连接
[ "0" = "$?" ] && { ##$?=0表示没有错误输出
echo 172.25.254.$IP
}
done
四、编写一个脚本,后面跟网卡名称,可以显示这块网卡的ip,对于多网卡这个脚本也能生效,并且没有添加网卡时会报错
#!/bin/bash
[ -z "$1" ] && {
echo "Error : Please input a interface"
exit
}
ifconfig $1 &> /dev/null || {
echo "$1 is not exist"
exit
}
ifconfig $1 | awk 'NR==2{print $2}' ##awk不指定分隔符时,默认分隔符为空格
五、编写一个脚本,检查1-10号可以连接的主机,并在可以ping通的主机上通过ssh连接来获得主机名称
#!/bin/bash
Auto_ssh() ##因为expect不属于shell命令,所以这里写一个函数来调用它
{
/usr/bin/expect <<-EOF ##将命令写进expect环境,这样就可以让expect命令在shell里被调用来运行,但是shell命令不能在expect环境里执行
spawn ssh root@$1 hostname
expect {
"yes/no" { send "yes\r" ; exp_continue }
"password" { send "westos\r" }
}
expect eof
EOF
}
for IP in {1..10}
do
ping -c1 -w1 172.25.254.$IP &> /dev/null
if [ "$?" = "0" ]
then
Auto_ssh 172.25.254.$IP | tail -n 1 ##expect用ssh连接后执行hostname命令,最后一行即位主机名称
fi
done
六、编写一个脚本,满足以下要求
a) 如果系统存在用户 luck,并且使用/bin/bash,则输出 user ok
b) 如果系统村存在用户 luck,则输出提示他的shell不属于/bin/bash
c)如果系统不存在用户 luck,则可以自动创建这个用户
d) 当在系统上运行命令 user cm d 时,将输出指令“echo hello;ls-l” 的结果,并在重启后也生效。
#!/bin/bash
cat >> /etc/profile<<-EOF
alias usercmd="echo hello;ls -l"
EOF
`source /etc/profile`
id $1 &> /dev/null
SHELL=`grep -E "^$1\>" /etc/passwd | awk -F : '{print $7}'`
if [ "$?" = "0" -a "$SHELL" = "/bin/bash" ]
then
echo user ok
elif [ -z "$1" ]
then
echo "Error : Please input a username"
elif [ "$?" != "0" -a -z "$SHELL" ]
then
useradd $1
echo "user not exist"
elif [ "$?" != "0" -a "$SHELL" != "/bin/bash" ]
then
echo "user exist,but it's shell not /bin/bash"
fi