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、 双小括号(( )) 加上$做算术运算
- 省去$符号的算数运算,比较 + -
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