shell括号和linux算术运算

一、小括号()

1、单小括号()

a).命令组

(a=0;touch a.txt)

小括号中的内容会开启一个子shell独立运行;括号中以分号连接,最后一个命令不需要;各命令和括号无空格

b).命令替换$()

等于``

c).用于初始化数组。

[root@drbd-s scripts]# y=(a b c d)

[root@drbd-s scripts]# echo ${y[3]}

d

[root@drbd-s scripts]# echo ${y[*]} #获取所有数组

a b c d

2、双小括号(( )) 加上$做算术运算

  1. 省去$符号的算数运算,比较 + -

for((i=0;i<5;i++))

[root@drbd-s scripts]# for ((i=0;i<5;i++));do echo $i;done

if (($i<5))

a=5; ((a++)) 可将 $a 重定义为6

括号内支持多个表达式用逗号分开。

b.) 跨进制运算

二进制、八进制、十六进制运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)

二、中括号

1、单中括号[ ] 加上$做算术运算

字符串比较——==和!=

整数比较——不等于:-gt:大于;-lt :小于;-eq:等于;-ne

数组索引——array[0]

2.双中括号[[]]

  • 字符串比较——可以把右边的作为一个模式,而不仅仅是一个字符串[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

逻辑运算符——防止脚本许多逻辑错误,比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

三、大括号{}

创建匿名函数——不会新开进程,括号内变量余下仍可使用。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。

[root@drbd-s scripts]# { p=q;}

[root@drbd-s scripts]# echo $p

四、符号$后的括号

(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。

${ } 用来作变量替换。

一般情况下,$var 与 ${var} 并没有啥不一样。

但是用 ${ } 会比较精确的界定变量名称的范围,比方说:

$ A=B

$ echo $AB

原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,

但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…

若使用 ${ } 就没问题了:

$ echo ${A}B

BB

(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。

(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。

linux shell算术运算

1:使用 expr 外部程式

加法 r=`expr 4 + 5`

echo $r

注意! '4' '+' '5' 这三者之间要有空白

r=`expr 4 * 5` #错误

乘法 r=`expr 4 \* 5`

带括号的

expr \( 5 - 3 \) \* 3 + 1

2:使用 $(( ))

r=$(( 4 + 5 ))

echo $r

3:使用 $[ ]

r=$[ 4 + 5 ]

echo $r

乘法

r=`expr 4 \* 5`

r=$(( 4 * 5 ))

r=$[ 4 * 5 ]

echo $r

除法

r=`expr 40 / 5`

r=$(( 40 / 5 ))

r=$[ 40 / 5 ]

echo $r

减法

r=`expr 40 - 5`

r=$(( 40 - 5 ))

r=$[ 40 - 5 ]

echo $r

求余数

r=$[ 100 % 43 ] 列子::7%3 余数为1

echo $r

乘幂 (如 2 的 3 次方)

r=$(( 2 ** 3 ))

r=$[ 2 ** 3 ]

echo $r

注:expr 沒有乘幂

4:使用let 命令

加法:

n=10

let n=n+1

echo $n #n=11

# let I_D="$I_D"+"$II_D"

乘法:

let m=n*10

echo $m

除法:

let r=m/10

echo $r

求余数:

let r=m%7

echo $r

乘冪:

let r=m**2

echo $r

虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。

另外,我们在 script 中经常有加1操作,以下四法皆可:

m=$[ m + 1]

m=`expr $m + 1`

m=$(($m + 1))

let m=m+1

另外,还可以使用bc

m=`echo "( $a - 1 )*$b +1" |bc`

5.bc命令

[root@drbd-s scripts]# echo 59*3 |bc

177

[root@drbd-s scripts]# echo 59/3 |bc

19

[root@drbd-s scripts]# echo "59/3" |bc

19