case示例
----------------------------------------------------------------------
.. echo "case" | grep -f- *
* 例一:输入一个键,判断是大写字母,小写字母,还是数字
::
#!/bin/sh
#echo -n "hit a key:"
#read key
read -n 1 -p "hit a key:" key # -n参数加数字代表只需输入几个字符
echo
case "$key" in
[[:upper:]] )
echo "upper letter"
;;
[[:lower:]] )
echo "lower letter"
;;
[[:digit:]])
echo "number"
;;
* )
echo "others"
esac
# if [[ "$key" =~ [[:upper:]] ]]; then echo OK; else echo KO; fi
* 例二:交互输入人名,选择性别,并显示相应的资料信息
::
read -p "input your name:" name
read -n 1 -p "choose your sex: example(m/f): " sex
sleep 1
echo
case "$sex" in
m )
echo "hello,Mr $name,welcome!"
;;
f )
echo "hello,Mrs $name,welcome!"
;;
*)
echo "please choose m (male) or f(female);"
exit 1
esac
* 例三:改写例二,在case里再嵌套case菜单,使选项更丰富
::
echo -n "input your name: "
read name
while true
do
echo "================================="
echo " choose your sex "
echo " 1-male "
echo " 2-female "
echo " 0-exit "
echo "================================="
echo "please enter your choice (0-2): "
read choice
case "$choice" in
1 )
clear
echo "hello,Mr $name,welcome!"
read -n 1 -p "are you married? y/n:" ans1
case "$ans1" in
Y|y )
echo
echo "congratulations!"
;;
N|n )
echo
echo "come on!"
;;
* )
echo
echo "Sir,please answer y or n!"
;;
esac
;;
2 )
clear
echo "hello,Mrs/Miss $name,welcome!"
read -n 1 -p "are you married? y/n:" ans2
case "$ans2" in
Y*|y* )
echo
echo "I am happy for you!"
;;
N*|n* )
echo
echo "what a pity!"
;;
* )
echo
echo "Madam,please answer y or n!"
;;
esac
;;
0 )
clear
exit 0
;;
* )
echo "invalid choice! please choose 0-2!"
sleep 2
clear
;;
esac
done
* 例四:用select做一个选项菜单
::
PS3="please choose your OS:" # PS3是select命令用来加入提示符的符号,如果不用PS3去指定的话,默认会使用#?
echo
select os in xp win7 vista redhat redflag unix
do
echo
echo "your operation system is $os"
echo
break
done
数组
-----------------------------------------------
数组的定义
连续数组的定义::
[root@server4 shell03]# a=(1 2 3 4 "safd sdfa") --有空格的字符串中间加空格
[root@server4 shell03]# echo ${a[0]} --第一个用0
1
[root@server4 shell03]# echo ${a[1]}
2
[root@server4 shell03]# echo ${a[2]}
3
[root@server4 shell03]# echo ${a[3]}
4
[root@server4 shell03]# echo ${a[4]}
safd sdfa
不连续数组的定义::
[root@server4 shell03]# b[3]='aaa'
[root@server4 shell03]# b[4]='bbb'
[root@server4 shell03]# b[7]='ccc'
[root@server4 shell03]# echo ${b[3]}
aaa
[root@server4 shell03]# echo ${b[4]}
bbb
[root@server4 shell03]# echo ${b[7]}
ccc
[root@server4 shell03]# echo ${b[1]}
查看数组的全部值::
[root@server4 shell03]# echo ${b[*]}
aaa bbb ccc
[root@server4 shell03]# echo ${b[@]}
aaa bbb ccc
[root@server4 shell03]# echo ${a[*]}
1 2 3 4 safd sdfa
[root@server4 shell03]# echo ${a[@]}
1 2 3 4 safd sdfa
查看数组的个数::
[root@server4 shell03]# echo ${#a[*]}
5
[root@server4 shell03]# echo ${#b[*]}
3
函数
---------------------------------------------------------------
::
函数名 () {
代码块
}
function 函数名 {
代码块
}
调用函数时, 直接把函数名当命令使用. 所有函数也可以有参数, 与脚本的位置参数相同
* 例五:把例四写成函数的形式
::
PS3="please choose your OS:"
echo
youros () {
select os in xp win7 vista redhat redflag unix
do
echo
echo "your operation system is $os"
echo
break
done
}
echo "================="
youros
echo "================="
clear
youros
* 例六:交互输入一个目录,使用脚本判断目录里每个文件的权限(只判断是否可读,可写,可执行就好,suid,sgid,stiky bit可以不判断)--用函数来实现
chkpermission.sh
* 例七:简单模拟写一个服务启动脚本(有启动,关闭,重启,状态等功能)
::
start () {
for ((i=1;i<=15;i++))
do
echo -n ">"
sleep 0.3
done
echo -e '\033[32mOK\033[m'
echo -e ' [32mOK [m'
# 31红, 32绿, 33黄
}
stop () {
for ((i=1;i<=15;i++))
do
echo -n ">"
sleep 0.3
done
echo -e '\t\t[\033[31mFail\033[m]'
}
case "$1" in
start )
start
;;
stop )
stop
;;
restart )
stop
start
echo -e '\t\t[\033[33mWarning\033[m]'
;;
* )
echo "Usage:start|stop|restart"
exit 1
;;
esac
* 例八: 使用函数写一个小程序,拥有下面几种功能,
- 选择1,可以从192.168.0.4的NFS共享里下载所有笔记并保存到本机的/notes目录下
- 选择2,打包并压缩,要求带有时间标记,移动到比如:/backup/2012/12/2012-12-23.notes.tar.bz2 ,然后删除/notes下的文件,并发送邮件通知到xx@qq.com(邮件主题写上自己的姓名)
- 选择0,退出程序
::
year=`date +'%Y'`
month=`date +'%m'`
day=`date +'%Y-%m-%d'`
time=`date +'%Y-%m-%d %H:%M:%S'`
downloadnotes () {
mkdir /notes 2> /dev/null
cd /notes
# 下面两行只是从ftp下载的示例, 需要改成nfs的相关操作命令
#echo 'mirror shell' | lftp 192.168.0.4
#echo 'mirror ule_basic' | lftp 192.168.0.4
}
tarnotes () {
mkdir /backup/$year/$month -p
tar cjf /backup/$year/$month/$day.notes.tar.bz2 /notes
rm /notes/* -rf
echo "tar notes OK in $time"|sendmail -v root > /dev/null 2>&1
# echo "邮件正文" | mail -s "邮件主题" tom@localhost
}
while true
do
echo "=================================================="
echo " A program for download notes and backup it "
echo "=================================================="
echo " "
echo " 1-down load notes resource "
echo " 2-backup notes resource "
echo " 0-exit this program "
echo " "
echo "=================================================="
echo "Please enter your choice(0-2):"
read choice
case "$choice" in
1 )
clear
downloadnotes
;;
2 )
clear
tarnotes
;;
0 )
exit 1
clear
;;
* )
echo "You can only choose 0-2!"
sleep 5
clear
esac
done
* 例九:使用函数和case菜单,写一个usb挂载的脚本 (有挂载,卸载,列出挂载内容,usb拷文件到系统,系统拷文件到usb,退出程序等功能)
练习
----------------------------------------------------------------------
1. 用户一登录,就把它登录的时间,用户和从哪里登录过来的信息给记录下来(使用下面的格式):
时间(要求时间精确,显示秒) 用户 from
要求使用数组去做
提示使用下面的定义方式
::
[root@server4 shell03]# a=(`ifconfig eth0 |grep Bcast`)
[root@server4 shell03]# echo ${a[0]}
inet
[root@server4 shell03]# echo ${a[1]}
addr:10.1.1.45
[root@server4 shell03]# echo ${a[2]}
Bcast:10.1.1.255
[root@server4 shell03]# echo ${a[3]}
Mask:255.255.255.0
...................................
now=`date +'%Y-%m-%d %H:%M:%S'`
array1=(`ps |grep bash`)
mytty=${array1[1]}
array2=(`who |grep $mytty`)
echo -e "$now\t${array2[0]}\t${array2[4]}"
.. note::
如果要用户一登录就执行它,可以把这个脚本执行的语句加到/etc/profile里,把显示的内容重定向到一个文件
2. 使用函数和case菜单写一个备份恢复的脚本(备份目录,恢复目录,退出等功能,要求用函数的嵌套)
3. 备份24小时内被修改的文件,使用函数 backup.sh
ps. find
-mtime +2 两天前的文件(超过24*2的文件)
-mtime +1 一天前的文件(超过24小时的文件)
-mtime 1 一天前当天的文件
-mtime 2 两天前当天的文件
-mtime -1 一天内的文件
-mtime -2 两天内的文件
4. 找出某个目录下的空链接
要求:
* 用户可以指定一个目录做为脚本参数,而且可以指定多个, 如果不指定, 默认为当前目录
* 找出目录下的死链接(即链接的文件不存在) (test -e)
linkchk.sh
5. 写一个使用 case + shift 处理参数和选项的示例脚本
6. ssh远程无密码执行命令
7. 99乘法表
8. 验证一个用户是否在本系统上存在
附: 脚本中常用的一些工具
----------------------------------------------------------------------
Linux下的工具很多, 常用的也不少, 不一定要记得每个命令的所有参数和用法.
根据项目的环境和需要来选择合适的工具, 完美地解决问题, 这才是最重要的!
::
arch uname basename dirname chmod
chown clear cp cpio cmp
diff date dd echo grep
expr file find id kill
pgrep xargs mail logger sed
sleep sort strings uniq tr
tail head sync tar tee
test time true wc zcat