31.获取网卡ip显示颜色
32.列出目录内容
33.下载文件
34.猜数字
35.根据名字得数字
获取网卡ip显示颜色
题目要求
提示用户输入网卡的名字,然后我们用脚本输出网卡的ip,需要考虑下面问题:
-
输入的字符不符合网卡名字规范,怎么应对。
-
名字符合规范,但是根本就没有这个网卡又怎么应对。
-
获取网卡ip显示颜色
核心要点
ip add show dev eth0
代码
#!/bin/bash
ip add |awk -F ': ' '$1 ~ "^\[1-9\]" {print $2}' > /tmp/eth.list
while :
do
eths=\`cat /tmp/eth.list |xargs\` #变成一行,空格分割
read -p "Please input a if name(The eths is \`echo -e "\\033\[31m$eths\\033\[0m"\`): " eth #显示网卡名颜色
if \[ -z "$eth" \]
then
echo "Please input a if name."
continue
fi
if ! grep -qw "$eth" /tmp/eth.list #不再网卡列表中
then
echo "The if name is error."
continue
else
break
fi
done
if_ip()
{
ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt # ' inet '精准匹配
n=\`wc -l /tmp/$1.txt|awk '{print $1}'\`
if \[ $n -eq 0 \]
then
echo "There is no ip address on the eth."
else
echo "The ip addreess is:"
for ip in \`cat /tmp/$1.txt\`
do
echo -e "\\033\[33m$ip\\033\[0m" #ip地址颜色
done
fi
}
if_ip $eth
32.列出目录内容
题目要求
写一个脚本,实现如下功能:
-
脚本可以带参数也可以不带
-
参数可以有多个,每个参数必须是一个目录
-
脚本检查参数个数,若等于0,则列出当前目录本身,否则显示每个参数包含的子目录。
核心要点
$#参数个数
test -d filename
find $d -type d
代码
#!/bin/bash
if \[ $# -eq 0 \] # $# 参数个数
then
echo "当前目录下的文件是:"
ls .
else
for d in $@ # $@ 是指一堆参数 xxx.sh 1 2 3 4 5
do
if \[ -d $d \]
then
echo "目录$d下有这些子目录:"
find $d -type d
else
echo "并没有该目录:$d"
fi
done
fi
33.下载文件
题目要求
定义一个shell函数,能接受两个参数,满足以下要求:
-
第一个参数为URL,即可下载的文件,第二个参数为目录,即下载后保存的位置
-
如果用户给的目录不存在,则提示用户是否创建,如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本
-
如果给的目录存在,则下载文件,下载命令执行结束后测试文件下载成功与否,如果成功,则返回0给调用脚本,否则,返回52给调用脚本
核心要点
$#参数个数是否为2
$2是否为目录
代码
#!/bin/bash
if \[ $# -ne 2 \]
then
echo "你必须要输入两个参数,第一个参数是网址,第二个参数是目录."
exit 1
fi
if \[ ! -d $2 \]
then
while :
do
echo "你输入的第二个参数,并不是一个存在的目录。是否要创建该目录呢?(y|n): "c
case $c in
y|Y)
mkdir -p $2
;;
n|N)
exit 51
;;
*)
echo "请输入y或者n."
continue
;;
esac
done
else
cd $2
wget $1
if \[ $? -eq 0 \]
then
exit 0
else
echo "下载失败."
exit 52
fi
fi
34.猜数字
题目要求
写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。
核心要点
$RANDOM可以生成一个随机数
随机数除以101取余则得到0-100的随机数字
代码
#!/bin/bash
n=$\[$RANDOM%101\]
while :do
read -p "请输入一个0-100的数字:" n1
if \[ -z "$n1" \]
then
echo "必须要输入一个数字。"
continue
fi
n2=\`echo $n1 |sed 's/\[0-9\]//g'\`
if \[ -n "$n2" \]
then
echo "你输入的数字并不是正整数."
continue
else
if \[ $n -gt $n1 \]
then
echo "你输入的数字小了,请重试。"
continue
elif \[ $n -lt $n1 \]
then
echo "你输入的数字大了,请重试。"
continue
else
echo "恭喜你,猜对了!"
break
fi
fi
done
35.根据名字得数字
题目要求
写一个shell脚本,能实现如下需求:
-
执行脚本后,提示输入名字(英文的,可以是大小写字母、数字不能有其他特殊符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
-
如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
-
前面已经输出过的数字,下次不能再出现
-
当输入q或者Q时,脚本会退出。
核心要点
判断名字合法性[a-zA-Z0-9]
$RANDOM除以100取余得到0-99之间的随机数
代码
#!/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