实例三十一:【下载文件】
需求:定义一个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