shell—100实例(40)

实例三十一:【下载文件】

需求:定义一个shell函数,能接收两个参数,满足以下要求:

1、第一个参数为URL,即可下载的文件,第二个参数为目录,即下载后保存的位置

2、如果用户给的目录不存在,则提示用户是否创建,如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本

3、如果给的目录存在,则下载文件,下载命令执行结束后测试文件下载成功与否,如果成功,则返回0给调用脚本,否则,返回52给调用脚本。

提示:

1、$#显示参数个数

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

脚本解析:

1、wget URL >此命令是linux系统中获取网上资料的

2、exit 51 >这是自定义脚本退出时,脚本返回值,可用于定位脚本分析;默认脚本执行成功的返回值为0,执行失败为非0

 

实例三十二:【猜数字】

需求:写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。

提示:

1、$RANDOM可以生成一个随机数

2、随机数除以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

脚本解析:

1、n=$[$RANDOM%101]  >此命令是获取一个1-100之间的方法,其中$RANDOM生成一个范围为[0-32767]的随机数,32767=65535/2

2、此脚本做了两次异常处理,第一是用户输入值为空时;第二次是用户输入值非空,但包含非数字的字符

 

实例三十三:【根据名字得出数字】

需求:写一个shell脚本,能实现如下需求:

1、执行脚本后,提示输入名字(英文的,可以大小写字母、可以数字,但不能有其他特殊字符),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字

2、如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果

3、前面已经输出过的数字,下次不能再出现

4、当输入q或者Q时,脚本会退出。

提示:

1、判断名字合法性[a-zA-Z0-9]

2、$RANDOM除以100取余得到0-99之间的随机数

#!/bin/bash
#根据名字得出数字
#
touch tmp_name.txt 2&>/dev/null
read -p "请输入名字(英文的,可以是大小写字母、数符号:" name
while [ "$name" != "q" ]
do
        sstr=`echo "$name"|sed 's/[a-zA-Z0-9]//g'`
        if [ -z "$sstr" ];then
                grep -w $name tmp_name.txt 2&>/dev/null
                if [ $? -eq 0 ];then
                        num=`grep -w "$name" tmp_name.txt | awk '{print $2}'`
                        echo "此名字已存在,且对应的号码为: $num"
                else
                        num=$[ $RANDOM % 100 ]
                        while grep -w "$num" tmp_name.txt
                        do
                                num=$[ $RANDOM % 100 ]
                        done
                        echo "$name $num" >>tmp_name.txt
                        echo "名字:$name  号码为: $num"
                fi
        else
                echo "请输入正确的格式!!!"
        fi
read -p "again:" name
done

脚本解析:

1、touch tmp_name.txt 2&>/dev/null   #2&>/dev/null的作用是无论其前面的命令执行成功与否,脚本的正常输出和错误输出都重定向到黑洞文件/dev/null

2、sstr=`echo "$name"|sed 's/[a-zA-Z0-9]//g'` #将变量$name中的大小字母和数字都删除

3、grep -w "$name" tmp_name.txt | awk '{print $2}' #此命令是精确匹配文档tmp_name.txt中包含变量$name的行

4、由于需求需要查询历史值,所以需要使用临时文件保存脚本运行过程中产生的数据

 

【脚本二】

#!/bin/bash
f=/tmp/user_number.txt
while :
do
        read -p "Please input a username:" u
        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
                                n=$[$RANDOM%100]
                                echo "用户$u对应的数字是:$n"
                                echo $u $n >> $f
                        fi
                else
                        n=$[$RANDOM%100]
                        echo "用户$u对应的数字是:$n"
                        echo $u $n >> $f
                fi
        fi
done

 

实例三十四:【一个数字的行】

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

提示:1、用sed替换所有非数字的字符为空,剩余的就是数字

#!/bin/bash
while read line
do
        n=`echo $line |sed 's/[^0-9]//g'|wc -L`
        if [ $n -eq 1 ]
        then
                echo $line
        fi
done < 1.txt

脚本解析:

1、wc -L  #此命令是获取传入字符串的长度

2、wc -l   #此命令是获取文档的行数

 

实例三十五:【查找在线IP】

需求:写一个shell脚本,把192.168.0.0/24网段在线的ip列出来

提示:

1、for循环遍历所有IP

2、看ip是否可以ping通

#!/bin/bash
#ping 某个网段的IP
#
ip=192.168.14.
for i in {1..50}
do
        ping -c 1 $ip$i 2&>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip$i success"
        else
                echo "$ip$i fail"
        fi
done

脚本解析:

1、ping -c 1 $ip$i  #-c 参数显示ping的次数,默认是不限次数

 

实例三十六:【检查脚本语法错误】

需求:写一个shell脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接用vim打开该shell脚本

提示:

1、sh -n

[root@centos-04 tmp]# vim 38.sh
#!/bin/bash
ifor i in `seq 1 254`
do
        if ping -c 2 -W 2 10.19.37.$i > /dev/null 2>/dev/null
        then
                echo "10.19.37.$i 是通的。"
        else
                echo "10.19.37.$i 不通。"
        fi
done
[root@centos-04 tmp]# sh -n 38.sh
38.sh:行3: 未预期的符号 `do' 附近有语法错误
38.sh:行3: `do'

脚本解析:

1、sh -n #此命令检查脚本语法

 

实例三十七:【自动给新建shell脚本添加执行权限】

需求:

1、根据用户提供的脚本名字,新建一个以此名字命名的脚本并加上sh后缀,并在脚本首行写入''#!/bin/bash"

2、脚本创建后,自动赋予其所有者可执行权限

3、打开新建脚本

#!/bin/bash
#new a file model for script!!
if [ $# -eq 1 ];then
        if [ ! -f $1.sh ];then
                touch $1.sh
                echo "#!/bin/bash" > $1.sh
                echo "" >>$1.sh
                chmod u+x $1.sh
                vim $1.sh
        else
                touch $12.sh
                echo "#!/bin/bash" > $12.sh
                echo "" >>$12.sh
                chmod u+x $12.sh
                vim $12.sh
        fi
else
        echo "Usage:./new_script.sh name"
fi

脚本解析:无

 

实例三十八:【格式化数字输出】

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

提示:

1、遍历所有数字,每个数字一行存入临时文件

#!/bin/bash
n=`echo $1|wc -L`
for d in `echo $1|sed 's/./& /g'`
do
        n2=$[$n%3]
        if [ $n2 -eq 0 ]
        then
                echo -n ",$d"
        else
                echo -n "$d"
        fi
        n=$[$n-1]
done |sed 's/^,//'
echo

脚本解析:

1、echo $1|sed 's/./& /g'  #此命令的作用是将变量$1中每个字符之间添加空格

2、n2=$[$n%3]   n=$[$n-1]  >此命令是整个脚本逻辑的核心,通过定位到字符串中位数是3的倍数,做出不同的处理

 

实例三十九:【问候脚本】

需求:编写一个问候程序,它执行时能根据系统当前的时间向用户输出问候信息。假设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。

提示:

1、date判断小时

#!/bin/bash
#send wenhou to user base on time
#
time=`date -d "+18 hour" +%H`
case $time in
00|01|02|03|04|05|06|07|08|09|10|11|12)
        echo "morning";;
13|14|15|16|17|18)
        echo "afternoon";;
19|20|21|22|23|24)
        echo "night";;
esac

脚本解析:

1、此处使用case语句的多个条件值进行判断

【脚本二】

#!/bin/bash
d=`date +%H`
if [ $d -ge 0 -a $d -lt 7 ]
then
        tag=1
elif [ $d -ge 7 -a $d -lt 12 ]
then
        tag=2
elif [ $d -ge 12 -a $d -lt 18 ]
then
        tag=3
else
        tag=4
fi
 
case $tag in
        1)
                echo "早上好"
                ;;
        2)
                echo "上午好"
                ;;
        3)
                echo "下午好"
                ;;
        4)
                echo "晚上好"
                ;;
        *)
                echo "脚本出错了"
                ;; 
esac   

 

实例四十:【菜单脚本】

需求:写一个shell脚本,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令

提示:

1、case  2、read   3、select

#!/bin/bash
#select a function base on your choice
#
menu(){
    cat <<EOF
    1-date
    2-ls
    3-who
    4-pwd
    5-exit
EOF
}
menu
read -t 5 -p "Please input a number:" num
while [ $num -ne '5' ]
do
read -t 5 -p "Please input a number:" num
case $num in
1)
    date +%F;;
2)
    ls -ahl;;
3)
    who;;
4)
    pwd;;
5)
    echo "离开"
    exit 7;;
esac
done

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值