Linux shell基本运算


shell脚本中的操作默认是字符串操作,在要运行数学运算符的时候可能得到意想不到的答案:

# var=1
# var=$var+1
# echo $var
1+1

从这个例子中可以看出在shell中使用’+’默认进行的是字符串连接的操作,需要注意的是空格。

在shell中可以使用let来指示算术表达式,let表达式内变量不用加$符号

# var=1
# let “var+=1” #或 let var+=1 ,但这种写法在运算符间不能有空格
# echo $var
2

这其中的let可以用(())代替,let “j=i*6+2″等价于((j=i*6+2)),就像很多的循环中用法一样。

注意: let必须是完整的算术表达式,即有等号两边
(())、expr 可以只有等号右边的计算,由$((…))、$(expr …)、`expr …` 查看返回结果

# var=1
# ((var++)) #直接查看结果:echo $((var++))
# echo $var
2

还有一种写法:
# var=1
# var=$[$var+1]
# echo $var
2

使用expr,需要注意的是其中的那个符号并不是单引号,而是“1”左边的那个键(反引号)

注意:将需要运算的表达式写入在 expr 后面,并保证参数与运算符号中间有空格隔开

# var=1
# var=`expr $var + 1`
# echo $var
2

1.在 shell 中$() 与 “等效。执行中间包含的命令语句,返回执行结果
2.从效率来说 let==(()) > expr > bc。let和(())运行是内建命令,使用相同的算法。
3.let 和 expr 的运算是整数运算,不包括浮点预算
4.expr 和 bc 是外部程序,expr的体积几乎等于bc的1/3,执行一次装入内存所消耗的时间就不一样。
5.从运算能力来说,bc排第一位。

上面的这几种做法都是只能处理整数运算,下面的这种做法是可以处理浮点数的:
# var=1
# var=`echo “scale=1;$var*2.0″|bc` bc预设输出整数,用scale 指定小数点下位数
# echo $var
2.0

注意是反引号而不是单引号,bc是linux上面的一个计算器,支持除位运算以外的所有运算功能。

另外一个支持浮点运算的方法是awk:
# var=1
# var=`echo “$var 1.1″|awk ‘{printf(“%g”,$1+$2)}’`
# echo $var
2.1

$ c=$(awk ‘BEGIN{print 7.01*5-4.01 }’)
$ echo $c


Bash shell 的算术运算有四种方式:

1:使用 expr

加法 r=`expr 4 + 5`
echo $r
注意!在 ‘4’ ‘+’ ‘5’ 这三者之间要有空白
r=`expr 4 * 5` #错误
乘法 r=`expr 4 * 5`

2:使用 $(( ))

r=$(( 4 + 5 ))
echo $r

3:使用 $[ ]

r=$[ 4 + 5 ]
echo $r

乘法
r=`expr 4 * 5`
echo $r
r=$(( 4 * 5 ))
echo $r
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 ]
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 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

参考地址:

下面是一个用awk命令计算一个非常大的数据文件的例子:

cat rands20M.txt | awk ‘{s+=$1} END {print s}’

Awk的一些技巧总结[不定期更新]

若你需要直接用终端,而不是依靠任何shell脚本来进行实数计算。你会怎么做(比如实数7.56+2.453)?
答案 : 我们需要用如下所述的特殊方式使用bc命令($ echo 7.56 + 2.453 | bc)将7.56+2.453作为输入通过管道进入bc中。

# curl -s http://nis.fzu.edu.cn/practice/zhuabao/1_2.php | grep -o "(.* "
(1784 + 529) x (8784 - 80) - (687 + 212 - 295) x 499

# result=`curl -s http://nis.fzu.edu.cn/practice/zhuabao/1_2.php | grep -o "(.* " | sed "s/x/*/g" | bc`

 

注意空格!!!

,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注