例子:给定一个路径,判断

如果为普通文件,显示之;

如果为目录,显示之;

否则,说无法识别;


#!/bin/bash

#

if [ ! -e $1 ]; then

echo "No such file."

exit 7

fi


if [ -f $1 ]; then

echo "Common file."

elif [ -d $1 ]; then

echo "Directory."

else

echo "Unknown file."

fi


bash的特殊参数:$0: 脚本名称;


/tmp/script.sh


basename $0

写一个脚本:可以接受一个参数,其使用形式如下:

script.sh {start|stop|restart|status}

如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;

如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;

如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;

如果参数为status,那么:

如果/var/lock/subsys/script文件存在,则显示为“script is running.”

否则,则显示为“script is stopped.”

其它任何参数:则显示“script.sh {start|stop|restart|status}”


进一步:修改start的机制为:

如果参数为start,且/var/lock/subsys/script文件不存在,则创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;

否则,显示“script is already running.”


进一步:修改stop的机制为:

如果参数为stop,且/var/lock/subsys/script文件存在,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;

否则,显示“script is stopped yet.”

SysV网络服务脚本:

# service network restart


# /etc/rc.d/init.d/network start


# /etc/init.d/network start




#!/bin/bash

#

SvcName=`basename $0`

LockFile="/var/lock/subsys/$SvcName"


if [ $# -lt 1 ]; then

echo "Usage: $SvcName {start|stop|restart|status}"

exit 3

fi


if [ $1 == 'start' ]; then

if [ -e $LockFile ]; then

echo "$SvcName is running."

else

touch $LockFile &> /dev/null

echo "Starting $SvcName successfully."

fi

elif [ $1 == 'stop' ]; then

if [ -e $LockFile ];then

rm -f $LockFile &> /dev/null

echo "Stopping $SvcName finished."

else

echo "$SvcName is stopped yet."

fi

elif [ $1 == 'restart' ]; then

rm -f $LockFile &> /dev/null

touch $LockFile &> /dev/null

echo "Restarting $SvcName successfully."

elif [ $1 == 'status' ]; then

if [ -e $LockFile ]; then

echo "$SvcName is running."

else

echo "$SvcName is stopped."

fi

else

echo "Usage: $SvcName {start|stop|restart|status}"

exit 4

fi

字符串测试:

>

<

==

!=

-z

-n

=~:模式匹配检测;

文件测试:

-e

-f

-d

-r

-w

-x

-s


测试条件的逻辑组合:组合测试

与:-a

或:-o

非:!


与:&&

或:||

非:!


if [ $# -gt 1 -a $# -lt 10 ]


if id $UserName &> /dev/null && [ `id -u $UserName` -ge 500 ]; then

练习:写一个脚本

给定一个文件:

如果是一个普通文件,就显示之;

如果是一个目录,亦显示之;

否则,此为无法识别之文件;

File=

if [ -f $File ]; then

echo

elif [ -d $File ]; then

echo

else

echo

fi


判断某目录中所有文件的类型:

for File in /var/log/*; do

if [ -f $File ]; then

echo

elif [ -d $File ]; then

echo

else

echo

fi

done



bash的编程之case语句:用法格式


case 变量引用(${}) in

value1)

语句1

语句2

...

;;

value2)

语句1

语句2

...

;;

value3)

语句1

语句2

...

;;

*)

语句1

语句2

...

;;

esac


#!/bin/bash

#


Com=$1


if [ -z $Com ]; then

Com=gzip

fi


[ -d /backup ] || mkdir /backup


case $Com in

gzip)

tar zcf /backup/etc-`date +%F-%H-%M-%S`.tar.gz /etc/*

RetVal=$?

;;

bzip2)

tar jcf /backup/etc-`date +%F-%H-%M-%S`.tar.bz2 /etc/*

RetVal=$?

;;

xz)

tar Jcf /backup/etc-`date +%F-%H-%M-%S`.tar.xz /etc/*

RetVal=$?

;;

*)

echo "Usage: `basename $0` {[gzip|bzip2|xz]}"

exit 6

;;

esac


[ $RetVal -eq 0 ] && echo "Backup etc finished.($Com)."

case语句解决上一个服务脚本的问题:

#!/bin/bash

#

SvcName=`basename $0`

LockFile=/var/lock/subsys/$SvcName


if [ $# -lt 1 ]; then

echo "Usage: $SvcName {start|restart|stop|status}"

exit 5

fi


case $1 in

start)

touch $LockFile

echo "Starting $SvcName finished." ;;

stop)

rm -f $LockFile

echo "Stopping $SvcName finished." ;;

restart)

rm -f $LockFile

touch $LockFile

echo "Restarting $SvcName finished." ;;

status)

if [ -e $LockFile ]; then

echo "$SvcName is running..."

else

echo "$SvcName is stopped..."

fi

;;

*)

echo "Usage: $SvcName {start|restart|stop|status}"

exit 6

esac


blog comments powered by Disqus

Published

31 October 2013

Tags