shell中let和(())、[]、test、[[]]区别

  • Post author:
  • Post category:其他



一、


let与(()) 在shell编程中是可以互换的





它们





我们可以像C语言那样写程序对于



变量




运算




赋值






在循环语句中控制变量变化非常有用;





1


、使用


(())


时,运算符两边需要有空格;


2





(())算数表达式的值在if和while判断时不用在前面加“$”;在echo输出值时需要加”$”


[root@zq-crmtest-20423tmp]# echo $((c = a + b


+  1


))


输出


4


3






let









(())




都只能对整数进行运算赋值





4


、使用


let





(())


赋值时,也可以使用


expr+


老板键代替;


(


如下,二者等价


)

letllines=$llines+$fileLines

llines=`expr $llines+ $fileLines`

实例:

[root@zq-crmtest-20423tmp]# a=1

[root@zq-crmtest-20423tmp]# b=2

[root@zq-crmtest-20423tmp]# let c=a+b

[root@zq-crmtest-20423tmp]# echo $c


输出


3

[root@zq-crmtest-20423tmp]# let a=1*111

[root@zq-crmtest-20423tmp]# echo $a


输出


111

[root@zq-crmtest-20423tmp]# ((c = a + b))

[root@zq-crmtest-20423tmp]# echo $c


输出


3

$ x=12

$ let “x<10”

$ echo $?

1

$ (( x > 10 ))

$ echo $?

0

$if ((x > 10 ))


>


then echo x greater


>


else echo x not greater


>


fi


二、


shell能够识别的表达式如下所示:

操作符     描述

-        减去

!        逻辑相反

* / %      乘,除,余数

+ –       加,减

<=  >= < > 关系比较

== !=      等于不等于

=        赋值


括号能够被用作改变表达式中计算的顺序





当使用逻辑和关系操作符,(!,<=,>=,<,>,++,~=),的时候,shell会返回一个代码变量,


$


?会反映结果是真还是假





再一次说明,必须使用双引号来防止shell将大于和小于运算符当作I/O重定向。



一、


先说[]和test,两者是一样的,在命令行里test expr


1


和[ expr


1


]的效果相同。


他们


的三个基本


作用是判断文件、判断字符串、判断整数


。支持使用与或非将表达式连接起来。要注意的有:


1.test





[]


中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。


2.论是字符串比较还是整数比较都千万不要使用大于号小于号。当然,如果你实在想用也是可以的,对于字符串比较可以使用尖括号的转义形式,如果比较”ab”和”bc”:[ ab \< bc ],结果为真,也就是返回状态为0




3. test





[]





的逻辑运算与或非只能使用


-a





-o





!

实例:

if  [ $a==”abc”  ]  ;then

fi

if test $var1 =”1″-a $var2 = “2” ; then

echo “equal”


f


i


if


[


$var1= “1”-a $var2 = “2”


]


; then

echo “equal”

fi


二、


[[ ]]是内置在shell中的一个命令,它就比刚才说的test强大的多了。简直强大的令人发指!


1.


支持字符串的模式匹配


(使用=~操作符时甚至支持shell的正则表达 式)。


逻辑组合可以不使用test的-a,-o而使用&&,||这样更亲切的形式


(针对c、Java程序员)。


2


.字符串比较时可以把右边的作为一个


模式





这是右边的字符串不加双引号的情况下。如果右边的字符串加了双引号,则认为是一个文本字符串。


),而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。











使用[]和[[]]的时候不要吝啬空格,每一项两边都要有空格



实例:

[[ $a == z* ]]    # 如果$a以”z”开头(模式匹配)那么将为true


[[$a == “z*” ]]




#如果$a等于z*(字符匹配),那么结果为true


[ $a == “z*” ]









[ $a == z* ]




#


效果一样,


如果$a等于z*(字符匹配),那么结果为true


!=




不等于,如:


if [ “$a” != “$b” ]




这个操作符将在


[[]]


结构中使用模式匹配


.


<


小于


,





ASCII


字母顺序下


.





:

if [[ “$a” < “$b” ]]

if [ “$a” \< “$b” ]







:





[]


结构中


“<”


需要被转义


.


-z


字符串为


“null”.


就是长度为


0.


-n


字符串不为


“null”





:


使用


-n





[]


结构中测试必须要用


“”


把变量引起来


.


使用一个未被


“”


的字符串来使用


! -z



版权声明:本文为liuxiao723846原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。