shell脚本之判断 if,elif, case (三)
例子:给定一个路径,判断
如果为普通文件,显示之;
如果为目录,显示之;
否则,说无法识别;
#!/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