linux脚本case语句,shell中的case语句,数组及函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值