算术扩展

语法:$((算术式))

如:

[root@localhost tmp]# i=$((8+20))

[root@localhost tmp]# echo $i

28

计算8+20的值,并且把值传给i

 

chapter8

 

算术运算

echo $((${j:-8}+2))

10

如果j不存在或者是控制,则${j:-8}结果为8,在和2做加法运算,

同理

echo $((k+4))

如果k不存在,则,值为0+4

小括号可以改变运算的优先级,如8*(1+3),则小括号的加法先算,在和8进行乘法运算

递增1

[root@localhost tmp]# r=6

[root@localhost tmp]# echo $((++r))

7

递减1

[root@localhost tmp]# r=6

[root@localhost tmp]# echo $((--r))

5

[root@localhost tmp]# echo r=$((4+m--))

r=10

[root@localhost tmp]# echo $m

5

[root@localhost tmp]

位左移

位右移

[root@localhost tmp]# m=16

[root@localhost tmp]# echo r=$((m<<2)) 以2进制的方式向左移一位,等于把值放大4倍

r=64

[root@localhost tmp]# echo r=$((m>>2)) 以2进制的方式向右移一位,等于把值减少4倍

r=4

[root@localhost tmp]#

 

使用外部程序expr做算术运算

加法expr 3 + 2

减法expr 3 - 2

乘法expr 3 \* 2

除法 expr 4 / 2

余数 expr 3 % 2

递增1

r=1

r=`expr $r +1`

 

 

expr对比样式

[root@localhost tmp]# r=`expr match "string" st`

[root@localhost tmp]# echo $"r=`expr match "string" st`"

r=2

[root@localhost tmp]# echo $"r=`expr match "string" str`"

r=3

[root@localhost tmp]# echo $"r=`expr match "string" stri`"

r=4

expr取字符串

[root@localhost tmp]# echo $"r=`expr substr "string" 1 3`"

r=str

[root@localhost tmp]# echo $"r=`expr substr "string" 2 3`"

r=tri

[root@localhost tmp]# echo $"r=`expr substr "string" 4 3`"

r=ing

由第1个字符s开始,取出3个字符长度的子字符串,2个例子同理

计算字符长度

echo $"r=`expr length "string"`"

r=6

使用$[]做算术运算和$()类似

[root@localhost tmp]# echo r=$[4+5]

r=9

[root@localhost tmp]# echo r=$[4-5]

r=-1

[root@localhost tmp]# echo r=$[4*5]

r=20

[root@localhost tmp]# echo r=$[4/5]

r=0

使用bash内置命令declare let做算术运算

declare -i I

I=8+1

I=8-1

I=8*2

I=8/2

I=8**8

let

let I=8+1

let I=8-1

let I=8*2

let I=8/2

let I=8**8

 

流程控制

 

流程控制有2大类,选择和循环,属于选择的有if case 属于循环的有for while until 命令 select 即属于选择也属于循环

bash的内置变量$?用来存储每个命令执行后的传回状态值,

如果执行一个未知命令则传回状态$?为127,。如果一条命令没有执行权限则为126!

 

 

 

if语法

if-then-else

if 条件测试; then

         命令区域

fi

 

if-then-else

if 条件测试 ;then

         命令区域1

else

         命令区域2

fi

解释:如果条件测试为真,就执行命令1,如果为假则执行命令2

 

例子:

#!/bin/bash

 

declare -i a b #将 a b 设为整数

a=$1

b=$2

if ((a<b))

then

         echo "$a 大于 $b"  ###如果a小于b那么现实a小于b

elif ((a>b))

then

         echo "$a 小于 $b" ###如果第一个条件不成立,检查a是否大于b,返回结果

else

         echo "$a 等于 $b" ####以上两个都不是的话,那么a肯定等于b

fi  #fi结束

 

 

 

 

 

条件测试的写法

条件测试或条件判断,有多种形式,测试结果是真是假,就看传回的值是否为0

总结下来有以下10种

1:执行某一个命令的结果

这里的命令可包括管道命令,如命令1 命令2 命令3 其结束状态为最后一个命令执行的结果

if grep -q "rm" test.sh #grep -q 表示不现实,借助$?来传回执行结果

        then

echo "fine rm"

        else

echo "not find"

fi

 

传回某一执行结果的向相反值

其形式为!命令

解释,如果命令传回值为0 则加上!之后变为1,反之如果为非0,则假上!变为0

if !grep -q "rm" test.sh

        then

echo "not fine rm"

        else

echo " finded"

fi

 

 

使用bash关键词 [[',']] 组成的式子:[[判断式]]

判断式会传回真假值,0为真,非0为假

if [[ str > xyz ]]

        then

echo "str big"

        else

echo "xyz big"

fi

 

使用内置命令test判断

if test "str" \> "xyz"

then

echo "str big"

else  

echo "xyz big"

fi

 

使用内置命令[]

[]和test用法相同,两者可以改写互换

 

 

使用 -a -o进行逻辑组合

-a是且的意思

-o是或的意思

 

 

&&

称为逻辑的and,如果命令1为真,才会执行命令2

a=20

if grep -q "rm" test.sh && [ $a -lt 100 ] #线搜寻test.sh中有没有rm这个字符串,如果有比较$a和100 如果小于传回ok,反之则not ok

        then

echo "ok"

        else

echo "not ok"

fi

~           

&&特性经常来当做一种隐性的if语法

[ -z "$ps1" ] && return

解释,线判断$ps值是否为空,如果是就执行return命令,由自shell环境,返回父shell,等于是激素执行了该脚本,

如果用if

if [ -z "$ps1" ] ; then return ;fi

[ -f /proc/net/if_inet6 ] && echo '支持 ipv6'

 

 

||

逻辑或,如果命令1执行结果为假,才会执行命令2

a=200

if grep -q "rm" tst.sh ||  [ $a -lt 100 ]

        then

echo "ok"

        else

echo "not ok"

fi

||,也可以当做是一种隐性的if语法!

prefix="/home"

defpath="/usr/local/bin"

[ -z ${prefix:-} ] || prefix=${defpath%/*}  -z测试$prefix ,一位$prefix值为非空,所以,${prefix:-}变量扩展的传回值为prefix的变量值,非空为假,更具||的特性会执行prefix=${defpath%/*}

他会有$defpath后方删除符合样式的/*的最短字符串,即删去/bin,因此$prefix 的值为/usr/local

 

echo $prefix

/usr/local

如果改写为if语句为!

prefix=/home

defpath=/usr/local/bin

if [ -z ${prefix:-} ]

        then

prefix=${defpath%/*}

 

fi

 

 

 

&&和||合用

if [ -n "$DEBUG" ]

then

         set -v

else

         set +v

fi

 一些小总结

[[]],  test,  [] 的意思和用法是相近的,但是[[]] 比其他两个更有自由 因为 [[]] 不必担心某些bash特殊字符对运算符的影响,不急写一叠转义字符,

比如 [[ str < xyz ]] 但是在[] 中却要写成[  str  \> xyz  ] 转义忘了。容易发生错误,在[[]]中 < > && || 等都可以自由的使用,不必使用转义字符

除了[[]] 外bash中(())也不必理会上述提到的特殊字符

另外要注意的是在[[ 判断式 ]]  中,如果使用== 或者是!= 如果没有加单引号或者双引号则==, !=会视为对比该字符串所形成的样式,如果相符传回0,如果不符传回1

例子:

a=str

if [[ $a ==??? ]] ;then

echo "match"

fi

如果把???改为"???" 此时==就变成是判断$a 和字符???是否相等