高级Bash脚本编程指南(8):操作符

来源:互联网 发布:jaeapp.com仿冒淘宝 编辑:程序博客网 时间:2024/05/19 02:00
高级Bash脚本编程指南(8):操作符

成于坚持,败于止步

=

通用赋值操作符, 可用于算术和字符串赋值

算术操作符
+
加法计算
-
减法计算
*
乘法计算
/
除法计算
**
幂运算(c语言中没用过的)

%
模运算, 或者是求余运算(返回一次除法运算的余数)

这里重点说一下“=”

root@ubuntu:~/resource/shell-study/0506-2013# var=27root@ubuntu:~/resource/shell-study/0506-2013# echo $var 27root@ubuntu:~/resource/shell-study/0506-2013# var= 2727: command not foundroot@ubuntu:~/resource/shell-study/0506-2013# string=helloroot@ubuntu:~/resource/shell-study/0506-2013# echo $stringhelloroot@ubuntu:~/resource/shell-study/0506-2013# string= helloThe program 'hello' can be found in the following packages: * hello * hello-debhelperTry: apt-get install <selected package>
上面可以看到,=的左右两边是不能出现空格的,否则则会出现上面的报错信息,另外还有一点就是赋值语句中的“=”和字符串比较语句中的“=”要注意区分,书中作者也给出了一种更好更安全的使用方法

#!/bin/bashstring1="hello"string2="hello"if [ "X$string1" = "X$string2" ];thenecho "X+string1=X+string2"elseecho "error"fiexit 0
这种方法在两个比较的字符串中同时添加了一个共同项“X”,这样可以防止两个变量中的一个为空所产生的错误,字符"X"作为前缀在等式两边是可以相互抵消的
另外书中还给出了一个计算最大公约数的方法,可以看一下

#!/bin/bashARGS=2BADARGS=65if [ $# -ne "$ARGS" ];thenecho "Usage: `basename $0` first-number second number"exit $BADARGSfigcd (){dividend=$1divisor=$2reminder=1until [ "$reminder" -eq 0 ]do let "reminder = $dividend % $divisor"dividend=$divisordivisor=$reminderdone}gcd $1 $2echo "Gcd of $1 and $2 = $dividend"exit 0
+=
"加-等于" (把变量的值增加一个常量然后再把结果赋给变量)
let "var += 5" var变量的值会在原来的基础上加5.
-=
"减-等于" (把变量的值减去一个常量然后再把结果赋给变量)
*=
"乘-等于" (先把变量的值乘以一个常量的值, 然后再把结果赋给变量)
let "var *= 4" var变量的结果将会在原来的基础上乘以4.
/=
"除-等于" (先把变量的值除以一个常量的值, 然后再把结果赋给变量)
%=
"取模-等于" (先对变量进行模运算, 即除以一个常量取模, 然后把结果赋给变量)
算术操作符经常会出现在 expr或let表达式中.

expr通用求值表达式: 通过给定的操作(参数必须以空格分开)连接参数, 并对参数求值. 可以使算术操作, 比较操作, 字符串操作或者是逻辑操作.
expr 3 + 5
返回8
expr 5 % 3
返回2
expr 1 / 0
返回错误消息, expr: division by zero,不允许非法的算术操作.
expr 5 \* 3
返回15,在算术表达式expr中使用乘法操作时, 乘法符号必须被转义.
y=`expr $y + 1`
增加变量的值, 与let y=y+1和y=$(($y+1))的效果相同.

在Bash中的整型变量事实上是一个有符号的long(32-bit)整型值, 所表示的范围是-2147483648到2147483647. 如果超过这个范围进行算术操作的话, 那么将不会得到你期望的结果,当然,在2.05b版本之后, Bash开始支持64位整型了
Bash不能够处理浮点运算. 它会把包含小数点的数字看作字符串,如果非要做浮点运算的话, 可以在脚本中使用bc, 这个命令可以进行浮点运算, 或者调用数学库函数

位操作符
<<
左移一位(每次左移都相当于乘以2)
<<=
"左移-赋值"
let "var <<= 2" 这句的结果就是变量var左移2位(就是乘以4)
>>
右移一位(每次右移都将除以2)
>>=
"右移-赋值" (与<<=正好相反)
&
按位与
&=
"按位与-赋值"
|
按位或
|=
"按位或-赋值"
~
按位反
!
按位非
^
按位异或XOR
^=
"按位异或-赋值"
逻辑操作符
&&
与(逻辑)

if [ $condition1 ] && [ $condition2 ]# 与 if [ $condition1 -a $condition2 ] 相同# 如果condition1和condition2都为true, 那结果就为true. if [[ $condition1 && $condition2 ]]    # 也可以.# 注意: &&不允许出现在[ ... ]结构中.
||
或(逻辑)

if [ $condition1 ] || [ $condition2 ]# 与 if [ $condition1 -o $condition2 ] 相同# 如果condition1或condition2中的一个为true, 那么结果就为true. if [[ $condition1 || $condition2 ]]    # 也可以.# 注意||操作符是不能够出现在[ ... ]结构中的. 

混杂操作符,逗号操作符可以连接两个或多个算术运算. 所有的操作都会被运行(可能会有负作用), 但是只会返回最后操作的结果

let "t1 = ((5 + 3, 7 - 1, 15 - 4))"echo "t1 = $t1"               # t1 = 11let "t2 = ((a = 9, 15 / 3))"  # 设置"a"并且计算"t2".echo "t2 = $t2    a = $a"     # t2 = 5    a = 9
测试实例:

#!/bin/basha=24 b=47if [ "$a" -eq 24 ] && [ "$b" -eq 47 ];thenecho "Test #1 succeeds."elseecho "Test #1 fails."fi#error method#if [ "$a" -eq 24 && "$b" -eq 47 ];then#echo "Test #1 succeeds."#else#echo "Test #1 fails."#fi#right methodif [ "$a" -eq 24 -a "$b" -eq 47 ];thenecho "Test #2 succeeds."elseecho "Test #2 fails."fiif [ "$a" -eq 98 ] || [ "$b" -eq 47 ];thenecho "Test #3 succeeds."elseecho "Test #3 fails."fiif [ "$a" -eq 98 -o "$b" -eq 47 ];thenecho "Test #4 succeeds."elseecho "Test #4 fails."fia=rhinob=crocodileif [ "$a" = rhino ] && [ "$b" = crocodile ];thenecho "Test #5 succeeds."elseecho "Test #5 fails."fiexit 0

先到这里了,O(∩_∩)O~

我的专栏地址:http://blog.csdn.net/column/details/shell-daily-study.html

待续。。。。

原创粉丝点击