我们写脚本时,要用到条件判断,选择,循环等,下面我来一一作介绍。
1.条件判断
主要有三种:1)test 表达式
2)[ 表达式 ] 表达式两边必须有空格
3)[[ 表达式 ]]
我们经常用到的条件测试有以下几种:
文件测试:-e FILE是否存在
-f 是否是普通文件
-d 是否是目录
-h/-L 是否是符号链接文件
-r 对当前用户是否可读
-w 对当前用户是否可写
-x 对当先用户是否可执行
-s 是否存在,并且不为空
-O 判断文件的发起者是不是该文件的属主
-G 判断文件的发起者是不是该文件的属组
整数测试:
双目运算符:
-lt小于 ,[ $A -lt $B ]
-le小于或等于,
-gt大于
-ge大于或等于
-eq等于
-ne不等于
例如接收两个参数,比较大小,并且显示出来:
[ $1 -ge $2] && echo "$1 is the max number" || echo "$2 is the max number"
字符串测试:
== 等于
> 大于
< 小于
!=,<> 不等于
-z 判断一个字符是否为空,为空则为真
-n 判断一个字符是否为空,不为空则为真
组合条件:
-a 判断的条件同时具备 例如:[ -x $FILE -a -w $FILE ]
-o 任何一个条件成立,or的意思。
-not,! 反向状态,例如test -x file,当file没有x权限时,返回真。
例如:写一个脚本:
判断一个文件是否存在,如果存在就显示存在。
#!/bin/bash
[ -e $1] && echo "$1 has exsit." || echo "$1 does not exsit."
2.条件判断
格式:单分支
if [ 表达式 ];then
statement
....
fi
双分支
if [ 表达式 ];then
statement
....
else
statement
....
fi
多分支
if [ 表达式 ];then
statement
....
elif [ 表达式 ];then
statement
....
elif [ 表达式 ];then
statement
....
else
statement
....
fi
例如:1)让用户通过命令行传递一个路径,判断其是否存在,如果存在,判断是什么文件类型。
(1)如果是普通文件,显示之
(2)否则,如果是目录,显示之
(3)否则,如果是链接,显示之
(4)否则,显示无法识别
2)如果不存在,显示不存在。
#!/bin/bash
if [ -e $1 ];then
echo -e "$1 exists,then what the filestyle:"
if [ -L $1 ];then
echo -e "$1 is a link-file"
elif [ -d $1 ];then
echo -e "$1 is a directory"
elif [ -f $1 ];then
echo -e "$1 is a ordinary-file"
else
echo -e "unknow"
fi
else
echo -e "$1 does not exsit."
fi
3.循环
1)for 循环
格式: for 变量 in 列表;
statement
......
done
例如:计算100以内所有偶数的和
#!/bin/bash
let SUM=0
for I in `seq 1 100`;do
if [ $[$I%2] -eq 0 ];then #表示100以内能被2整除的数
SUM=$[$SUM $I]
fi
done
echo "$SUM
for之前我们已经谈过了,这里就不再多说了。
2) while循环
格式:
while [ 表达式 ];do
statement
....
done
只要满足条件就进行循环,下面我们来举一个例子。
例如:计算1加到100的和
#!/bin/bash
let I=1
let SUM=0
while [ $I -le 100 ];do
let SUM=$I
let I++
done
echo "$SUM"
我之前介绍过佛如可以实现一次读一行,那while是否也能够一次读一行呢?当然是可以的。
用for实现一次读一行
IFS=$'\n'
for I in `cat /etc/inittab`;do
用while实现一次读一行
while read LINE;do
...
...
done < /etc/inittab
例如:读取/etc/passwd,显示出用户名和SHELL,形如:root,SHELL:/bin/bash
#!/bin/bash
while read LINE;do
USERNAME=`echo $LINE|cut -d ":" -f1`
USERSHELL=`echo $LINE|cut -d ":" -f7`
echo "$USERNAME,SHELL:$USERSHELL"
done < /etc/passwd
3)until循环
until [ 表达式 ];do
...
...
done
只有当条件满足时,才会退出程序。否则,会一直循环下去。
写一个脚本:
1.查看redhat用户是否登录了系统,如果登录了,就通知当前脚本执行者“redhat is logged on.”;
2.否则,就睡眠5秒钟后再次进行测试;直到其登录为止退出;
要求:使用until循环
#!/bin/bash
until who |grep "^redhat" &> /dev/null;do
sleep 5
done
echo "redhat is logged on"
其实条件判断还可以用类似正则表达式的方式进行表示,这样可以减少变量,而且,可以简化你的程序。
阅读(1605) | 评论(0) | 转发(0) |