shell学习笔记之i f-then -test命令学习

shell 中的 test 命令

学习test命令之前,首先我们看if - then语句类型

if command

then

commands

fi

或者

if command; then

commandds

fi

原理:

bash shell的if语句会允许if行定义的那个命令。

如果该命令的退出状态码(0-255)是0(表示该命令成功运行),位于then后面的命令就会被执行。

如果该命令退出状态码是非0值,那then部分的命令就不会被执行。bash shell会执行脚本中的下一个命令。

在then部分,可以用多个命令。bash shell会将这部分命令当成一个块。只有在if语句行那个命令返回退出状态码状态码为0时执行这块命令,在if语句行命令返回非0值状态码时跳过这块命令。


test命令格式:

test condition


conditon是test命令要测试的一系列参数和值。当在if -then语句中时,test命令看起来是这样的:

if test conditon

then

commands

fi

bash shell提供了另外一种在if-then中声明test命令的方法:

if [ condition]

then

commands

fi


即用方括号[  ]定义了test命令用到的条件。

但是必须注意:必须在[]方括号左括号右侧和右括号左侧各加一个空格,否则会报错。


[  ]方括号形式的test命令可以判断3类条件:

1、数值比较;

2、字符串比较

3、文件比较


数值比较:注意,[  ] 数值比较用英文字母缩写

n1 -eq n2            #检查n1是否等于n2,eq是equals缩写,相当于数学符号=
n1 -ge n2            #检查n1是否大于或等于n2相等,ge是greater or equals缩写,相当于数学符号>=

n1 -gt n2             #检查n1是否大于n2,gt是greater than缩写,相当于数学符号>

n1 -le n2             #检查n1是否小于或等于,le是less or equals缩写,相当于数学符号<=

n1 -lt n2              #检查n1是否小于n2,lt是less than缩写,相当于数学符号<

n1 -ne n2            #检查n1是否不等于n2,ne是not equals缩写,相当于数学符号!=


数值条件的测试可以用在数字和变量上:

eg:

VAL1=10

VAL2=11


if [ $VAL -gt 5 ]

then

echo "The test value $VAL1 is greater than 5"

fi


注意:test [  ] 命令无法处理变量中存储的浮点值。bash shell能处理的数仅有整数。


if-then的高级特性

形式:

if (( expression )) ; then  双尖括号(( ))用于数学表达式。expression:表达式的意思。

[ ] test命令(即方括号)只允许你在比较中进行简答的算数操作。

双尖括号(( expression ))中expression除了支持标准的数学运算符,还可以是任何数据赋值或比较表达式,

双尖括号命令中会用到的其他运算符:

val++    后增

val--      后减

++val  先增

--val    先减

!          逻辑求反

~         位求反

**         幂运算

<<       左位移

>>       右位移

&         位布尔 与

|          位布尔 或

&&      逻辑和

||         逻辑或


eg:

cat test

#!/bin/sh

val=10

if (( val**2 > 90 ))             ##双星号,球迷运算

then

(( val2 = val1 ** 2 ))

echo "The square of $val1 is $val2"

fi

说明:使用双尖括号不需要对表达式中的数学符号进行转义,比如上例中>号。





字符串比较

str1 = str2        #检查str1是否和str2相同

str1 != str2       #检查str1是否和str2不同

str1 > str2        #检查str1是否比str2大

str1 < str2        #检查str1是否比str2小

-n str1              #检查str1的长度是否非0

-z str1              #检查str1的长度是否为0


test命令比较字符串需要注意事项:


1、test的比较会 将所有的标点和大写也考虑在内。

2、>、<大于小于号必须转义,否则shell会认为是重定向符号

eg:

var1=baseball

var2=hockey

if [ $var1 \> $var2 ]

3、大于小于顺序和sort命令所采用的不同,即sort命令处理大写字母的方法刚好跟test命令相反。

在test[  ] 命令中,大写字母会被当成小于小写字母的。

test命令使用标准的ASCII顺序,根据每个字符的ASCII数值来决定排序

sort命令使用本地化语言设置中定义的排序顺序。

4、用-n or -z参数判断变量长度是否为非0 或者判断长度为0时,未在shell中定义的变量的长度仍然为0.


if-then的高级特性

if [[  ]]; then   双方括号提供了针对字符串比较的高级特性

[[ expression ]]  双方括号里的expression使用了test命令中采用的标准字符串进行比较。

但是他提供了另一个特性-模式匹配(pattern matching),在末世匹配中可以定义一个正则表达式来匹配字符串值:

eg:

if [[ $USER == te* ]]

then

echo "Hello"

else 

echo "Sorry"


文件比较

-d file     检查file是否存在并是一个目录,d是directory的首字母

-e file     检查file是否存在,e是exit的首字母

-f file      检查file是否存在并是一个文件,f是file的首字母

-r file      检查file是否存在并可读,r是read的首字母

-s file     检查file是否存在并非空,

-w file    检查file是否存在并可写,w是write的首字母

-x file     检查file是否存在并可执行,

-O file    检查file是否存在并属当前用户所有

-G file    检查file是否存在并且默认组与当前用户相同

file1 -nt file2  检查file1是否比file2新,nt new than

file1 -ot tile2   检查file2是否比file2旧,ot old than


复合条件测试


if-then 可允许你使用布尔逻辑来组合测试。

形式;
[ condition1 ] && [ conditon2 ]   and 即与运算,两个条件都必须满足才执行then后面的语句。

[ conditon1 ] || [ conditon2 ]      or 即或运算,两个条件有一个满足就可执行then后面的语句。




你可能感兴趣的:(shel编程学习笔记)