一、运算符
案例1:加减乘除
方法1
[root@localhost s]# cat t1.sh
#!/bin/basha = $1b = $2echo a + b = $(( $a + $b ))echo a-b = $((a-b))echo a *b = $((a*b))echo a /b = $((a/b))echo a %b = $((a%b))[root@localhost s] #chmod a+rx t1.sh[root@localhost s] # ./t1.sh 10 3a + b = 13a-b = 7a *b = 30a /b = 3a %b = 1
方法2
[root@localhost s] # cat 1.1.sh#!/bin/bashread -p "please input two number:" a becho $a + $b = $(( $a + $b ))echo $a - $b = $((a-b))echo $a * $b = $((a*b))echo $a / $b = $((a/b))echo $a % $b = $((a%b))[root@localhost s] #chmod a+rx t1.sh[root@localhost s] # ./t1.shplease input two number:3 43 + 4 = 73 -4 = -13 *4 = 123 /4 = 03 %4 = 3
案例2:综合练习
二、运算操作符与运算命令
[root@server s]# a=1
[root@server s]# b=2[root@server s]# a+b
bash: a+b: command not found...
[root@server s]# $((a+b))
bash: 3: command not found...
[root@server s]# echo $((a+b))
3
[root@server s]# echo $(($a+$b))
3
[root@server s]# echo $[a+b]
3
root@server s]# c=a+b #没有结果
[root@server s]# echo $c
a+b
[root@server s]# c=$[a+b]
[root@server s]# echo $c
3
[root@server s]# c=0
[root@server s]# let a+b #没有结果
[root@server s]# let c=a+b #将需要的计算结果赋值给一个变量
[root@server s]# echo $c
3 # 注意let中运算符左右不能由空格
[root@server s]# expr a+b
a+b
[root@server s]# expr $a+$b
1+2
[root@server s]# expr $a + $b #支持变量
3
[root@server s]# expr $a + $b + 'a' #可以辨别是不是整数,只支持整数运算
expr: 非整数参数
[root@server s]# echo $?
2
[root@server s]# expr 1+2 # 注意+左右必须要有空格
1+2
[root@server s]# expr 1 + 2
3
[root@server ~]# c=`expr 4 + 2`
[root@server ~]# echo $c
6
[root@server ~]# c="i hate"
[root@server ~]# expr length "$c"
6
交互式
[root@server ~]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2
3
1+9
10
quit
[root@server ~]#非交互式
# 不进入交互模式直接使用, bc 需要放在最后[root@server ~] # echo "scale=3;11/3" | bc3 .666# scale=3 表示保留运算精度[root@server ~] # seq -s '+' 1 10 | bc
55
[root@localhost ~] # awk 'BEGIN {print 2+3*2}'8[root@localhost test4] # echo "6.282 3.14" | awk '{print ($1-$2)}'3 .142[root@localhost ~] # declare -i r=3+2[root@localhost ~] # echo $r5
三、变量的字符截取
[root@server ~]# f=f1.tar.gz
[root@server ~]# echo $f
f1.tar.gz
[root@server ~]# echo ${f}
f1.tar.gz
[root@server ~]# echo $f
f1.tar.gz[root@server ~]# echo ${#f} #计算字符个数
9
[root@server ~]# echo $f
f1.tar.gz[root@server ~]# echo ${f:0} #从第0个字符开始往后切
f1.tar.gz[root@server ~]# echo ${f:1} #从第1个字符开始往后切
1.tar.gz[root@server ~]# echo ${f:2} #从第2个字符开始往后切
.tar.gz
[root@server ~]# echo ${f:3:3} #从第3个字符开始,往后切3个字符
tar
[root@server ~]# name=xiao.xiao.xia
[root@server ~]# echo ${name#x} #寻找在开头的‘x’,并去掉
iao.xiao.xia[root@server ~]# echo ${name#i} #寻找在开头的‘i’,但是’i‘不在开头,所以没有作用
xiao.xiao.xia
[root@server ~]# echo ${name#xi} #寻找在开头的‘xi’,奏效
ao.xiao.xia[root@server ~]# echo ${name#*i} #“*‘表示任意一个字符,寻找任意1个字符和i组合开头
ao.xiao.xia[root@server ~]# echo ${name#**a} #寻找任意2个字符和”a“组合开头
o.xiao.xiao.xia
[root@server ~]# echo ${name#***o} #寻找任意3个字符和”o“组合开头
.xiao.xiao.xia
[root@server ~]# echo ${name#xiao}
.xiao.xia
[root@server ~]# echo ${name#.}
xiao.xiao.xia[root@server ~]# echo ${name#*.} #从左到右寻找第1个’任意1个字符与“.”的组合‘
xiao.xia
[root@server ~]# echo ${name##*.} #从左到右寻找最后一个’任意1个字符与“.”的组合‘
xia[root@server ~]# echo ${name%*.}
xiao.xiao.xia
[root@server ~]# echo ${name%.*} #从右到左寻找第1个’任意1个字符与“.”的组合‘
xiao.xiao
[root@server ~]# echo ${name%%.*} #从右到左寻找最后1个’任意1个字符与“.”的组合‘
xiao
[root@server ~]# name=xiao.xiao.xiao.xiao[root@server ~]# echo ${name/xiao/haha} #用’haha‘代替第一个’xiao‘
haha.xiao.xiao.xiao
[root@server ~]# echo ${name} #变量值本身没有变化
xiao.xiao.xiao.xiao
[root@server ~]# echo ${name//xiao/haha} #用’haha‘代替所以的’xiao‘
haha.haha.haha.haha
[root@server ~]# echo ${name}
xiao.xiao.xiao.xiao
四、练习
1 、写一个 shell 脚本,计算 1 + 2 + …… + n 共 n 个值的和, n 值由用户输入2 、让用户输入一个文件名,分别输出该文件的所在目录和该文件的扩展名3 、判断用户输入的数值是几位数4 、统计用户输入的目录文件中文件的个数
1、
[root@server s]# cat test1.sh
#!/bin/bash
read -p "请输入一个数字n:" n
echo "1 到 $n 的总和是:`seq -s '+' 1 $n | bc`"
[root@server s]# ./test1.sh
请输入一个数字n:10
1 到 10 的总和是:55
2、
[root@server s]# cat test2.sh
#!/bin/bash
read -p "请输入一个文件名(带路径):" f
echo "文件所在目录为:${f%/*}"
echo "文件的扩展名为:${f##*.}"
[root@server s]# ./test2.sh
请输入一个文件名(带路径):/s/tset2.sh
文件所在目录为:/s
文件的扩展名为:sh
3、
[root@server s]# cat test3.sh
#!/bin/bash
read -p "请输入数字:" n
echo $n 是${#n}位数
[root@server s]# ./test3.sh
请输入数字:78992
78992 是5位数
4、
[root@server s]# cat test4.sh
#!/bin/bash
read -p "请输入目录名:" f
echo "$f 中的文件有" `ls $f | wc -l` "个"
[root@server s]# ./test4.sh
请输入目录名:/s
/s 中的文件有 7 个