1、当用户输入网卡名称时,输出IP地址信息:需要考虑如下两个问题:
当用户输入的网卡名不存在,则怎么应对;
网卡名称符合规范,但是根本没有这个网卡怎么办;
难点1:那么如何获取到 网卡的名称, 可以使用查询命令 ip addr;在使用awk冒号分隔符,以 $1 匹配数字开头的内容,并打印出 $2;
ip addr|awk -F ': ' '$1~"^[0-9]" {print $2}'
[root@fenye2019 shell]# ip addr|awk -F ': ' '$1~"^[0-9]" {print $2}'loeth0
2、那么如何获取到网卡的IP 呢; ip addr|grep -w 'eth0'|grep 'inet'|awk '{print $2}'|awk -F '/' '{print $1}'
[root@fenye2019 shell]# ip addr|grep -w 'eth0'|grep ' inet'|awk '{print $2}'|awk -F '/' '{print $1}'172.17.226.62
思路:先把网卡列表查找出来并写入到一个临时文件里 /tmp/eth.list,然后使用while 循环用来用户的输入变量,如下选项:
[root@fenye2019 shell]# echo "please input a name(The is `cat /tmp/eth.list|xargs`): "
please input a name(The is lo eth0): 然后需要判断是用 if -z 判断这变量是否为空,如果为空,则continue,继续循环崇while出执行重新输入内容,如果不为空,则在使用if 判断输入的变量是否等于 /tmp/eth.list,如果不存在,则提示用户输入错误;再次从while处开始循环,如果输入正确,则使用break,结束本次while循环;继续执行下面的函数;再次定义一个if_ip( )来过滤IP地址,过滤出来IP地址并写入临时文件 $1.txt($1则表示给函数传递的第一个参数,即$ethx),然后用 wc 判断它的行数是否等于,如果为 0 则表示没有IP地址,给用户提示,如果不为 0 ,则打印出这个IP地址信息;
最后使用函数来列出即可: if_ip $eth
[root@fenye2019 shell]# cat 31.sh #!/bin/baship addr|awk -F ':' '$1~"^[0-9]" {print $2}' > /tmp/eth.listwhile :do read -p "please input a if name(The ehts is `cat /tmp/eth.list|xargs`): " eth if [ -z "eth" ] then echo "please input a name " continue fi if ! grep -wq "$eth" /tmp/eth.list then echo "The is name is error " continue else break fidoneif_ip(){ ip addr show dev $1|grep ' inet '|awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt 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 is address is: " cat /tmp/$1.txt fi}if_ip $eth
当然,为了更加直观,也可以给输出的IP地址加上颜色;
可以写成一个变量的形式:
eth=`cat /tmp/eth.list` read -p "please input a if name(The ehts is `echo -e "\033[31m$eths\033[0m"`): " eth#修改脚本如上两行,可以修改在read -p 输入时显示红色的:在最下面的函数里,当输出的IP地址文本不为空时,则列出可以使用一下for循环,这样会显示IP地址的黄色颜色即可; for ip in `cat /tmp/$1.txt` do echo -e "\033[33m$ip\033[0m" done
2、写一个脚本可以带参数也可以不带,参数可以是一个也可以多个,每个参数必须是目录,检测参数个数,如果等于 0 ,则列出当前目录本身,否则显示每个参数的子目录;
注释:判断参数的个数:可以用到 $# == 0 等同于 $# -eq 0
检查是否是目录,可以使用 -d 选项;
列出某个目录下子目录: find / type d
[root@fenye2019 shell]# cat 32.sh #!/bin/bashif [ $# -eq 0 ]then ls .else for d in $@ do if [ -d $d ] then echo "The directory $d " find $d -type d else echo "not is directory" fi donefi[root@fenye2019 shell]# sh 32.sh 1.sh 31.sh 32.sh[root@fenye2019 shell]# sh 32.sh /etc/ /usr/local/
注释:可以用 $# 来判断参数输入的参数个数,当等于 0 时表示后面没有跟参数,使用ls . 列出当前目录本身;
当后面跟了参数:使用for d in $@ 来循环后面跟的参数,然后使用 if [ -d $d ] ,判断是否是目录,如果是则列出 find $d -type d;
$@ 则表示后面的参数内容, $# 表示参数个数 $0 表示脚本本身 $1 表示第一个参数 $2 表示第二个参数 以此类推
3、给一个shell脚本,定义两个函数,其中第一个为URL下载连接,第二个为下载目录,即是保存的位置;
如果用户给目录不存在,则提示是否创建,如果创建成功则继续执行,否则,返回一个51的错误给给用户;
如果用户下文件,测试文件下载成功与否,成功则返回 0 ∠本,否则返回52错误给用户;
分析:首先要判断一下输入的参数个数是否是2: if [ $# -ne 2 ] then echo "请输入两个参数"
根据题目要求,判断第二参数是否是目录且存在,不存在由用户选择是否创建: if [ ! -d $2 ] then while : do read ..... $c case $c in y|y ;; n|N 这样;
如果用户选择不创建,则返回错误值 51,不过在 函数里面,定义错误值,只能用户 return 51 如果用 exit 51 则会直接退出这个脚本;
判断是否下载成功,用 echo $? 来判断:
脚本内容如下:
[root@fenye2019 shell]# cat 33.sh #!/bin/bashif [ $# -ne 2 ]then echo "请输入两个参数,第一个参数为下载地址,第二个参数为目录" exit 1fiif [ ! -d $2 ]then while : do read -p "第二个目录不存在,是否创建该目录: " c case $c in y|Y) mkdir -pv $2 break ;; n|N) exit 51 ;; *) echo "你只能输入Y或者N " continue ;; esac donefi cd $2 wget $1 if [ $? -eq 0 ] then exit 0 else exit 51 fi执行这个脚本:参数是不存在的下载连接和目录:[root@fenye2019 shell]# sh 33.sh 1 /tmp/1第二个目录不存在,是否创建该目录: ymkdir: created directory ‘/tmp/1’--2019-02-21 15:28:53-- http://1/Resolving 1 (1)... 0.0.0.1Connecting to 1 (1)|0.0.0.1|:80... failed: Invalid argument.[root@fenye2019 shell]# echo $?51执行这个脚本:参数为正确的下载连接和目录:[root@fenye2019 shell]# sh 33.sh https://my.oschina.net/yuanhaohao/blog/2994879 /tmp/fenye第二个目录不存在,是否创建该目录: ymkdir: created directory ‘/tmp/fenye’--2019-02-21 15:30:21-- https://my.oschina.net/yuanhaohao/blog/2994879Resolving my.oschina.net (my.oschina.net)... 120.55.226.24Connecting to my.oschina.net (my.oschina.net)|120.55.226.24|:443... connected.HTTP request sent, awaiting response... 200 Length: unspecified [text/html]Saving to: ‘2994879’2019-02-21 15:30:22 (680 KB/s) - ‘2994879’ saved [65766][root@fenye2019 fenye]# ls /tmp/fenye/2994879 /tmp/fenye/2994879存在的则正常:
4、写一个猜数字脚本,当用户输入的数字和预设的数字(随机生成一个0-100的数字)一样时,直接退出,否则就让用户一直输入,并且提示用户输入的数字比预设数字大或者小:
分析:让用户一直输入,需要while 循环;
然后还需要判断用户输入的是否是正确的数字,比如包含英文或特殊符号都不算合格的数字,小数也不应该对,用户(包括数字大于小于)要提示: if [ -n "$2" ]
注释:首先需要生成一个随机数字: 使用系统内置变量RANDOM并取余数 n=$[$RANDOM%100] echo $n
[root@fenye2019 shell]# n=$[$RANDOM%100][root@fenye2019 shell]# echo $n16[root@fenye2019 shell]# n=$[$RANDOM%100][root@fenye2019 shell]# echo $n72
使用while 循环里 read -p 来要求用户的输入: read -p "please input number(1-100): " n1
然后判断输入的变量 n1 是否为空: if [ -z "$n1" ] then echo "必须输入一个数字" continue 来继续循环输入
然后判断收入的变量n1 是否是存数字: n2=`echo n1|sed 's#[0-9]##g'` if [ -n "$n2" ] then echo "you input not number" continue
然后使用比较随机生成数和用户输入数做对比,
if [ $n -gt $n1 ] then echo "你输入的数字小了,请重试" continue
elif [ $n -lt $n1 ] then echo "你输入的数字大了,请重试" continue else echo "恭喜你猜对了" break
注释:用 if 来判断一个变量时,需要用双引号来引起来才可以;
脚本内容如下:
[root@fenye2019 shell]# cat 34.sh #!/bin/bashn=$[$RANDOM%101]while :do read -p "pelase input nubmer(1-100): " n1 if [ -z "$n1" ] then echo "please input is number" continue fi n2=`echo $n1|sed 's#[0-9]##g'` if [ -n "$n2" ] then echo "please input 1-100" continue else if [ $n -gt $n1 ] then echo "您输入的数字小了,请重试" continue elif [ $n -lt $n1 ] then echo "您输入的数字大了,请重试" continue else echo "恭喜您答对了" break fi fidone执行脚本:[root@fenye2019 shell]# sh 34.sh pelase input nubmer(1-100): please input is numberpelase input nubmer(1-100): 50您输入的数字大了,请重试pelase input nubmer(1-100): adsfsdfsdfplease input 1-100
5、有一个脚本,提示输入名字(英文的,可以是大小写字母,数字不能有其他特殊符号),然后输出一个随机的0-99的数字,脚本并不会退出,继续提示让输入名字;
输入相同的名字,输出的数字还是第一次输入该名字时输出的结果,前面已经输出过的数字,下次不能再出现;
当输入q和Q时,脚本会退出;
分析:如何判断输入的是名字 不是 特殊字符: grep [^0-9a-zA-Z]
如何去随机的数字0-99: n=$[$RANDOM%100] echo $n
脚本不退出,可以使用while 循环;判断输入的数字和字母是否重复,需要借助临时文件(之前输入过的都写入到这个文件里)
注释:假设输入的用户刚刚是一个数字,并且和某个用户的数字是一样,会出现问题:可以使用awk -v 中传递 shell 的参数;
awk -v uu=$u '$1==uu {print $2}'
脚本内容如下:
[root@fenye2019 shell]# cat 35.sh #!/bin/bashf=/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#[0-9a-zA-Z]##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 n=$[$RANDOM%100] echo "用户$u对应的数字是: $n" echo $u $n >> $f fi fidone执行脚本:[root@fenye2019 shell]# sh 35.sh please input a username: user1用户user1对应的数字是: 63please input a username: user2用户user2对应的数字是: 76please input a username: 用户对应的数字是: 59please input a username: 59用户59对应的数字是: 50[root@fenye2019 shell]# sh 35.sh please input a username: q