shell编程2
-------条件测试
test命令用于测试字符串,文件状态和数字。
1、测试文件状态
test命令一般有2种格式:test condition或[ condition ]使用方括号时注意在条件两边加上空格。
常用的测试文件的条件表达式有:
-d:目录;-s:文件长度大于0、非空;-f:正规文件;-w:可写;-L:符号连接;-u:文件有suid位设置;-r:可读;-x可执行。
如:测试first文件是否可写:
test -w first
echo $?
返回0说明可写,否则不可写;或着:
[ -w first ]
echo $?
可以实现同样的功能。
2、字符串测试
字符串测试有5种格式:
test 'string'
test string_operator 'string'
test 'string1" string_operator "string2'
[ string_operatoer 'string' ]
[ 'string1' string_operator 'string2' ]
其中string_operator可以是以下符号:
=: 两个字符串相等;
!=: 两个字符串不等
-z: 空串
-n: 非空串
如:a="dfsd" b="sdgfg"测试a和b是否相等为:
[ '$a' = '$b']
echo $?
返回0说明相等,否则不相等。
3、测试数值
测试数值可以使用很多操作符,一般格式如下:"number1" numeric_operator "number2"或者[ "number1" numeric_operator "number2" ]其中numeric_operator可以是以下内容:
-eq:数值相等;-ne:数值不相等;-gt:第一个数大于第二个数;-lt:第一个数小于第二个数;-le:第一个数小于等于第二个数;-ge:第一个大于等于第二个数。
如测试两个数是否相等:
[ '100' -eq '130']
echo $?
返回0说明相等,否则不相等;测试变量var1=100 和 var2=130是否相等为: [ $var1 -eq $var2 ] echo $?
还可以使用逻辑操作符将两个测试表达式结合起来,如果都为真则结果为真:如
[ '100' -gt '200' -a '300' -le '400' ]
echo $?
-----------控制流结构
1、for循环
先看一个例子:
#!/bin/sh
for i in 1 3 5 7 9 2 4 6 8 10
do
echo $i
done
执行结果为:
1
3
5
7
9
2
4
6
8
10
in列表可以是shell命令的输出,如:
#!/bin/sh
for name in 'ls'
do
if [ -f $name ] ; then
echo '$name is a regular file'
elif [ -d $name ] ; then
echo '$name is a directory'
fi
done
需要指出,可以没有in语句,这是将等价于in '$@',如:
#!/bin/sh
i=1
for param
do
echo 'parameter #$i is $param'
i-$i+1
done
2、until循环
until循环就是通常所说的直到型循环,如:
#!/bin/sh
until [ i -f a.lock ]
do
sleep 1
done
echo "you string start another application safely"
b
上例的意义为:a.lock是一个锁文件,当a运行时创建该文件,因而b就可以知道a在运行;如果a停止运行,就删除该文件,因而b就知道a已经停止运行,可以安全启动了。
3、while循环
while循环的意义就是当条件成立时,继续往下执行,如:
#!/bin/sh
while read string
do
echo 'you string is $string'
done
echo "thank you , bye"
该脚本接受用户输入并打印到屏幕上,如果想结束,使用Ctrl+d组合键。
4、使用break和continue控制循环
下面是一个使用break跳出循环的例子,该脚本一直执行,除非按下Ctrl+d组合键:
#!/bin/sh
while read string
do
if [ $? != 0] ; then
break
fi
done
下面是一个使用continue的例子:
#!/bin/sh
for ( i=0; i<20; i=$i+1)
do
echo -n $i
if [ $i -lt 10 ] ; then
echo ''
continue
fi
echo 'this is a two digtal nenmber'
done
5、if then else语句
下面例子判断输入的分数等级:
#!/bin/sh
if [ $1 -lt '0' ] ; then
echo "erro"
elif [ '$1' -lt '60' ] ; then
echo "no pass"
elif [ $1 -lt '70' ] ; then
echo "pass"
elif [ $1 -lt '80' ] ; then #或者elif [ $1 -lt '80' ] then
echo "good" #echo "good"
elif [ $1 -le '100' ] ; then
echo "excellent"
else
echo "erro"
fi
需要指出,then或else后面不必是一条命令,可以是任意条命令,if和else带有的条件可以有很多;下面看几个例子:
grep输出检查示例:
#!/bin/sh
if grep 'chinese' a.txt > /dev/null 2>&1
then
echo 'this file include thw word 'chinese''
else
echo 'this file doesn`t include the word 'chinese''
fi
文件拷贝示例:
#!/bin/sh
if cp a.txt b.txt
then
echo "copy the file a.txt to b.txt sucess"
else
echo "can`t copy a.txt to b.txt"
fi
当前目录测试:
#!/bin/sh
dir='pwd'
if [ "$dir" != "/home/wangfnagyong" ]
echo "current directpry isn`t wangfangyong`s home"
else
echo "current directory is wangfangyong`s home"
fi
6、case 语句
举例说明:
#!/bin/sh
echo -n "do you want to continue this operator?" [n]
read yesno
case $yesno in
Y | y | Yes | yes)
echo "system will continue this operator"
;;
n | N | no | NO)
echo "system will skip this operator"
;;
*)
echo "incorrect input"
exit 1
;;
esac