试题一

输入一串随机数字,然后按千分位输出。 比如输入数字串为“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脚本,能实现如下需求:

  1. 执行脚本后,提示输入名字(英文的,可以是大小写字母、数字不能有其他特殊符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
  2. 如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
  3. 前面已经输出过的数字,下次不能再出现
  4. 当输入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 
最后修改日期: 2020年8月25日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。