试题一
输入一串随机数字,然后按千分位输出。 比如输入数字串为“123456789”,输出为123,456,789。
核心要点:
- for循环使用
#!/bin/bash
int_s=`echo $1|sed 's/[^0-9]//g'`
n=`echo $int_s|wc -L`
for i in `echo $int_s|sed 's/./& /g'`
do
flag=$[$n%3]
if [ $flag -eq 0 ]; then
echo -n ",$i"
else
echo -n "$i"
fi
n=$[$n-1]
done
试题二
编写一个问候程序,它执行时能根据系统当前的时间向用户输出问候信息。假设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
#!/bin/bash
d=`date +%H`
if [ $d -ge 0 -a $d -le 12 ]; then
flag=1
elif [ $d -gt 12 -a $d -le 18 ]; then
flag=2
else
flag=3
fi
case $flag in
1)
echo "早上好"
;;
2)
echo "中午好"
;;
3)
echo "晚上好"
;;
esac
试题三
写一个shell脚本,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。
#!/bin/bash
#!/bin/bash
red='\e[91m'
green='\e[92m'
yellow='\e[93m'
magenta='\e[95m'
cyan='\e[96m'
none='\e[0m'
function menu() {
echo -e "$yellow 1. $none执行date命令"
echo
echo -e "$yellow 2. $none执行ls命令"
echo
echo -e "$yellow 3. $none执行who命令"
echo
echo -e "$yellow 4. $none执行pwd命令"
echo
echo -e "$yellow q. $none执行exit命令"
echo
}
flag=true
while $flag
do
menu
read -p "$(echo -e "请选择菜单 [${magenta}1-4$none]:")" choose
if [ -z "$choose" ]; then
echo "请输入对应序号"
continue
fi
case $choose in
1)
date
;;
2)
ls
;;
3)
who
;;
4)
pwd
;;
q|Q)
flag=false
;;
*)
echo "USAGE:{1|2|3|4|q}"
;;
esac
done
试题四
写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。
#!/bin/bash
n=`echo $[$RANDOM%101]`
flag=true
while $flag
do
read -p $(echo -e "猜数字有些输入1-100的值"): choose
if [ -z "$choose" ]; then
echo "请输入整数1"
continue
fi
str_choose=`echo $choose|sed 's/[0-9]//g'`
if [ -n "$str_choose" ]; then
echo "请输入整数"
continue
fi
if [ $choose -gt $n ]; then
echo "值大了"
elif [ $choose -lt $n ]; then
echo '值小了'
else
echo "正确值:$n"
break
fi
done
试题五
写一个shell脚本,能实现如下需求:
- 执行脚本后,提示输入名字(英文的,可以是大小写字母、数字不能有其他特殊符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
- 如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
- 前面已经输出过的数字,下次不能再出现
- 当输入q或者Q时,脚本会退出。
#!/bin/bash
f=/tmp/user_number.txt
j_n()
{
while :
do
n=$[RANDOM%100]
if awk '{print $2}' $f|grep -qw $n
then
continue
else
break
fi
done
}
while :
do
read -p "Please input a username: " u
if [ -z "$u" ]
then
echo "请输入用户名."
continue
fi
if [ $u == "q" ] || [ $u == "Q" ]
then
exit
fi
u1=`echo $u|sed 's/[a-zA-Z0-9]//g'`
if [ -n "$u1" ]
then
echo "你输入的用户名不符合规范,正确的用户名应该是大小写字母和数字的组合"
continue
else
if [ -f $f ]
then
u_n=`awk -v uu=$u '$1==uu {print $2}' $f`
if [ -n "$u_n" ]
then
echo "用户$u对应的数字是:$u_n"
else
j_n
echo "用户$u对应的数字是:$n"
echo "$u $n" >>$f
fi
else
j_n
echo "用户$u对应的数字是:$n"
echo $u $n >> $f
fi
fi
done
#备注:没看明白题目意思
试题六
用shell实现,把一个文本文档中只有一个数字的行给打印出来。
#!/bin/bash
FILE=/tmp/pass.txt
line_n=`wc -l $FILE|awk '{print $1}'`
for i in `seq 1 $line_n`
do
n=`sed -n "$i"p $FILE|sed 's/[^0-9]//g'|wc -L`
if [ $n -eq 2 ]; then
echo "行:$i"
fi
done
试题七
系统logrotate工具,可以完成日志切割、归档。写一个shell脚本实现类似的归档功能。 举例: 假如服务的输出日志是1.log,要求每天归档一个,1.log第二天就变成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5。
#!/bin/bash
cd /data/logs
log=1.log
mv_log()
{
[ -f $1 ] && mv $1 $2
}
[ -f 1.log.5 ] && rm -f 1.log.5
for i in `seq 4 -1 1`
do
j=$[$i+1]
mv_log $log.$i $log.$j
done
mv 1.log 1.log.1
#备注:没状态写
试题八
写一个shell脚本,把192.168.0.0/24网段在线的ip列出来。
#!/bin/bash
#
# yum install -y nc
declare -x i=2
if [ -f /tmp/true.txt ]; then
rm -rf /tmp/true.txt
fi
if [ -f /tmp/flase.txt ]; then
rm -rf /tmp/flase.txt
fi
until [ $i -eq 255 ];do
ping -c 1 -W 1 192.168.0.$i &>/dev/null
result1=$?
nc -v -w 1 192.168.0.$i -z 31235 &>/dev/null
result2=$?
nc -v -w 1 192.168.0.$i -z 3389 &>/dev/null
result3=$?
if [ $result1 -eq 0 -o $result2 -eq 0 -o $result3 -eq 0 ]; then
echo -e "ip is up\033[32m 192.168.0.$i\033[0m" && echo "192.168.0.$i" >> /tmp/true.txt
else
echo -e "ip is down\033[31m 192.168.0.$i\033[0m" && echo "192.168.0.$i" >> /tmp/flase.txt
fi
i=$(($i+1))
done
试题九
写一个shell脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接用vim打开该shell脚本。
#!/bin/bash
sh -n $1 2>/tmp/sh.err
if [ $? -ne 0 ]
then
cat /tmp/sh.err
read -p "请输入q/Q退出脚本。" c
if [ -z "$c"]
then
vim $1
exit 0
fi
if [ $c == q ] || [ $c == Q ]
then
exit 0
else
vim $1
exit 0
fi
else
echo "脚本$1没有语法错误."
fi
#没看明白意思
试题十
输入一串随机数字,然后按千分位输出。 比如输入数字串为“123456789”,输出为123,456,789。
#!/bin/bash
n=`echo $1|wc -L`
for i in `echo $1|sed 's/./& /g'`
do
flag=$[$n%3]
if [ $flag -eq 0 ]; then
echo -n ",$i"
else
echo -n "$i"
fi
n=$[$n-1]
done | sed 's/^,//g'
echo
留言