试题一

输入一串随机数字,然后按千分位输出。 比如输入数字串为“123456789”,输出为123,456,789。

核心要点:

  • for循环使用
#!/bin/bash
int_s=`echo 1|sed 's/[^0-9]//g'`

n=`echoint_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 -ad -le 12 ]; then
    flag=1
elif [ d -gt 12 -ad -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-4none]:")" choose
    if [  -z "choose" ]; then
        echo "请输入对应序号"
        continue    fi
    casechoose 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=`echochoose|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 '{print2}' f|grep -qwn
    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=`echou|sed 's/[a-zA-Z0-9]//g'`
    if [ -n "u1" ]
    then
    echo "你输入的用户名不符合规范,正确的用户名应该是大小写字母和数字的组合"
    continue
    else
    if [ -ff ]
    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 un >> $f
    fi
    fi
done
#备注:没看明白题目意思

试题六

用shell实现,把一个文本文档中只有一个数字的行给打印出来。

#!/bin/bash
FILE=/tmp/pass.txt
line_n=`wc -l FILE|awk '{print1}'`

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 ] && mv1 2
}
[ -f 1.log.5 ] && rm -f 1.log.5
for i in `seq 4 -1 1`
do    j=[i+1]
    mv_loglog.ilog.$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 -oresult3 -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
    vim1
        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 `echo1|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日

作者

留言

撰写回覆或留言

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