字符串连接就是指将两个或多个相对独立的字符串,按照一定顺序连接,合整成一个新的字符串。如:字符串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中常用的与运算符号& | < > = != <= >=
[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内建的计算器: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 //输出结果