shell变量的运算

一、运算符

案例1:加减乘除

方法1

[root@localhost s]# cat t1.sh

#!/bin/bash
a = $1
b = $2
echo 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 3
a + b = 13
a-b = 7
a *b = 30
a /b = 3
a %b = 1

方法2

[root@localhost s] # cat 1.1.sh
#!/bin/bash
read -p "please input two number:" a b
echo $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
please input two number:3 4
3 + 4 = 7
3 -4 = -1
3 *4 = 12
3 /4 = 0
3 %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" | bc
3 .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 $r
5

三、变量的字符截取

[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 个

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值