shell编程中的变量运算——Shell编程学习_二

shell编程中的变量运算

shell编程中的字符串操作

字符串连接

字符串连接就是指将两个或多个相对独立的字符串,按照一定顺序连接,合整成一个新的字符串。如:字符串1:abc;字符串2:123;合成新的字符串3:abc123


[root@fsx ~]# str=hello     //定义一个字符串变量
[root@fsx ~]# echo $str     //输出字符串,输出时变量名前要加$
hello
[root@fsx ~]# str1=world    //定义另一个变量str1
[root@fsx ~]# str2=$str$str1    //定义变量str2,值为变量str和str1连接组成的新字符串
[root@fsx ~]# echo $str2    //可以看到新的变量str2为str和str1连接的结果
helloworld
[root@fsx ~]# str3=$str' '"fsx" //定义变量str3,并赋值为str变量和空格和字符串常量的组合
[root@fsx ~]# echo $str3
hello fsx

字符串长度

即:统计一个字符串字符个数

查看字符串长度要使用expr length命令


[root@fsx ~]# expr length "hello"   //查看字符串常量的长度
5
[root@fsx ~]# expr length "$str2" //查看变量值的长度
10
[root@fsx ~]# charcount=`expr length "$str3"`   //定义新的变量用来保存获取的字符串长度
[root@fsx ~]# echo $charcount //查看上面保存的长度变量
9

查找字符串中的字符位置

即:查找字符串中的指定字符的位置;使用expr index命令。注意:在shell中起始位置是1而不是0。

[root@fsx ~]# str="hello world"
[root@fsx ~]# echo $str
hello world
[root@fsx ~]# expr index "$str" "h" //查找字符串变量中'h'的位置,可以看到起始位置时1而不是0
1
[root@fsx ~]# expr index "$str" "l" //expr查找字符,如果同时存在多个相同字符,expr只能匹配到第一个
3
[root@fsx ~]# expr index "$str" "2" //如果查看的字符不存在,则返回0
0
[root@fsx ~]# expr index "$str" "edw"  //如果查看定义了多个字符,则只匹配第一个字符
2

字符串截断

即:获取一个字符串中指定位数的字符,生成一个新的子字符串。

要获取一个字符串的子字符串(截断),要使用expr substr $str POS LENGTH命令

包含三个参数:

  • $str是字符串变量名

  • POS是字符串的起始位置,也是要获取的子字符串的第一个字符

  • LENGTH是要获取的长度


[root@fsx ~]# str="hello world"
[root@fsx ~]# echo $str
hello world
[root@fsx ~]# expr substr "$str" 5 3    //截断str变量中从第四个位置开始,总长度为3的字符串
l o 

字符串匹配

编辑文本时,我们经常需要在文本中找到某串模式字符在整个文本中出现的位置,这个模式字符串即为用户查找输入的关键字,解决这个问题就需要用到字符串匹配。

字符串匹配使用正则表达式,这里仅简单演示,后面回有祥解。

字符串匹配要有两种模式(使用上没有任何区别):

  • expr $str: REGEXP

  • expr match $str REGEXP


root@fsx ~]# str="hello world 123456"   
[root@fsx ~]# echo $str
hello world 123456
[root@fsx ~]# expr "$str" : "\(.*[0-9]\(5\)\)"  //获取,字符串str变量中到5之前的所有字符
hello world 12345
[root@fsx ~]# expr "$str" : "\(.*[0-9]\(2\)\)"  //获取,字符串str变量中到2之前的所有字符
hello world 12
[root@fsx ~]# expr "$str" : "\([a-z ]*\).*"     //获取所有字母字符串
hello world 

shell编程中的数学运算

shell中的数学运算分为两类:

  • 逻辑运算

  • 数值运算

shell只提供了基本的运算能力,如果要更复杂的运算,需要借助其他的库。

逻辑运算

在shell中常用的与运算符号& | < > = != <= >=


[root@fsx ~]# num1=4
[root@fsx ~]# num2=9
[root@fsx ~]# num3=-1
[root@fsx ~]# expr $num1 < $num3
-bash: -1: No such file or directory
[root@fsx ~]# expr $num1 \< $num3
0
[root@fsx ~]# expr $num1 \< $num2
1
//0表示假,1表示真

因为 < 是输入输出流运算符号,所以在此需要转义

定义一个变量保存结果方式,可以不使用result=expr $num1 \< 19这样的方式,可以直接:


[root@fsx ~]# result=$[num1 < 20]
[root@fsx ~]# echo $result
1

" = "逻辑符号解释:


[root@shell ~]# num=3
[root@shell ~]# num1=4
[root@shell ~]# num2=7      //定义三个变量
[root@shell ~]# expr $num = $num1   //使用expr命令,比较两个变量是否相等
0
[root@shell ~]# expr $num=$num1 //如果" = "前后没有空格默认是字符串
3=4
[root@shell ~]# result=$[$num == $num1] //使用result方式时,[]里面应该时" == "方式,否则会报错;[]中不必须添加空格来截断表达式,因为[]默认知道是表达式
[root@shell ~]# echo $result
0
[root@shell ~]# result=$[$num = $num1]
-bash: 3 = 4: attempted assignment to non-variable (error token is "= 4")

数值运算

在shell中常用的数值运算符号 + - * / % ()等

简单例子:


[root@shell shell]# num1=3
[root@shell shell]# num2=4
[root@shell shell]# num3=5
[root@shell shell]# expr $num1 \* $num2     //此处需要转义
12
[root@shell shell]# result=$[$num1 * $num3]     //[]内不需要转义
[root@shell shell]# echo $result
15
[root@shell shell]# result=$[$num1/$num3]
[root@shell shell]# echo $result    //shell中默认都是整形数计算
0

shell编程中浮点运算

shell内建的计算器:bc命令,bash caculater

bc可以识别:数字(整形和浮点型)、变量、注释(以 # 开始的行,或者C语言的注释形式/* */)、表达式、编程语言、函数等。

默认情况下,有个scale值控制浮点表达,默认值为0。可以手动改变scale值,使得浮点运算结果为浮点类型。

安装bc:


yum install -y bc

简单bc使用介绍:


[root@shell shell]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.        //进入bc交互模式的一些提示信息,使用bc -q可以去掉。
12.5*3      //简单数字乘法
37.5        //运算结果
100/3       //除法运算
33          //这里输出结果为整形,因为scale值默认为0,scale的值表示小数点后的位数多少。
scale=4     //手动设置scale为4,这里设置是暂时的,退出bc再进入就恢复默认0。
100/3
33.3333     //结果变化,保留小数点后四位
3.3*(1+2)   //bc支持简单的括号运算
9.9
quit        //使用结束,使用quit命令退出,ctrl+d也可以退出。

bc中的变量声明


[root@shell shell]# bc -q
num=1       //可以每行声明一个变量
num1=3
num2=4;num3=0   //也可以再同一行声明多个变量,用" ; "隔开
num1*num2       //变量计算
12

如何在脚本中使用bc

  • 使用管道命令

var = `echo "options ; expression" | bc`

管道将前面命令的输出作为后一个命令的输入


[root@shell shell]# var=`echo "scale=3;2.14/2" | bc`
[root@shell shell]# echo $var
1.070

管道缺陷:很难写一些复杂的计算式。

  • EOF形式,内联输入重定向

var=`bc <

opstions

statements

expressions

EOF`

[root@shell shell]# var1=1.2
[root@shell shell]# var2=3.14
[root@shell shell]# var3=9
[root@shell shell]# var4=5.1
[root@shell shell]# result=`bc << EOF
scale=3
a = $var1 * $var2
b=$var3*$var4
a+b
EOF
`
[root@shell shell]# echo $result
49.668

在shell脚本中:

[root@shell shell]# vim bc.sh
[root@shell shell]# bash bc.sh 
49.668
[root@shell shell]# cat bc.sh 
#!/bin/bash
var1=1.2;var2=3.14;var3=9;var4=5.1  //定义变量
result=`bc << EOF       //使用EOF形式,进行运算
scale=3
a = $var1 * $var2
b=$var3*$var4
a+b
EOF
`
echo $result        //输出结果


你可能感兴趣的:(RH,Linux,杂)