linux基础值shell命令:几种运算符以及字符串操作

运算符,自然shell作为脚本编程也无法遗漏的地方。

其运算符分为:

  • 算数运算符
  • 关系运算符
  • 字符串运算符

算数运算符

其实shell原生的不支持件的数学运算,所以通过使用其他命令进行首先,比如awk和expr,其中expr是最常见的方式。

具体格式如下:

$((运算式))  或者 $[运算式]  或者  expr 运算式

#使用expr的时候,运算符间要有空格,
expr m + n
#如果expr的结果赋值给某个变量赋值使用需要使用反引号
k='expr m + n'

具体算数运行,以及对于的意义,不过下面写的==也通过算数运算=演变的运算符,不过其结果式布尔值。

比如 a=10 ;b=20;

运算符 说明 举例
+ 加法 expr $a + $b 结果为 30。
- 减法 expr $a - $b 结果为 -10。
* 乘法 expr $a \* $b 结果为 200。
/ 除法 expr $b / $a 结果为 2。
% 取余 expr $b % $a 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

关系运算符

这个在shell中很其他,其支持数字,(如果字符串是纯数字的话也可以使用)。这个很多时候会用在判断语句作为条件使用。

声明两个值a=1,b=2;

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

补充:[]

[ 条件 ]
 #  条件前后必须有空格
 #[  ] 没有条件默认其为false
 #[ 数字或字符串 ] 没有关系运算符默认为ture

好奇为什么示例都使用[] ,其是是条件语句格式而已,如果单独使用关系运算符的话,没有if或者while等逻辑运算符会报错。例如

在这里插入图片描述

在这里插入图片描述

可见其无法单独使用,其使用必须在条件语句中。

逻辑运算符

运算符 说明
&& 或者 -a 逻辑的 AND
||或者-o 逻辑的 OR
非运算

字符串运算符

下面会列出常用的字符串运算符,变量a=”aa“,b=“bb”

运算符 说明 举例
= 检测两个字符串是否相等,相等返回true否则false [ a = a = a=b] 的值 false
!= 检测两个字符串是否不相等,不相等返回true,否则返回false [ a ! = a!= a!=b] 的值 true
-z 检测字符串长度是否为0 ,如果0为true,否则返回false [-z $a] 的值false
-n 与-z刚好相反,检测字符串长度是否不为0,如果不为0为true,否则返回false [-z $a] 的值true
$ 检测字符串是否为空,不为空,返回true。 [$a]值为true

为什么带有[]这个要求和使用的地方,和关系运算符一样,在if等语句中作为条件使用。

看上面,有一个奇怪的地方,那就是字符是否连接,比如将a和b连接在一起。

#!/bin/bash
a='aa'
b='bb'

c=$a$b #中间不能有空格
c1="$a $b" #如果被双引号包围,就可以有空格
c2="$b;$b" #可以在中间添加其他字符串
c3="$a"cc"$b" # 也可以这样写
c4=${a}cc$b # 也可以这样写
echo $c
echo $c1
echo $c2
echo $c3
echo $c4    

为什么c= a a ab中间不能有空格,因为没有被任何一种引号包围,其中的空格对shell命令来说代表这一行的结束

c=$a $b
#echo $c
输出的是aa

字符串变量声明的时候可以不带有引号,shell 默认所以

c3="$a"cc"$b" 
#可以这样写
但是注意:
    1: 如果两个带有各自的引号,而字符串各自分号这样写  "$a"cc"$b"  或者$a"cc"$b或者"$a""cc""$b"
    2:  如果$a被后面cc的话,需要用{}对其范围进行限制比如${a}cc,如果没有{}的存在的话,$acc会选择acc这个变量名。但是如果是特殊 符号比如(: , 等)可以省略{}范围。因为$b后面没有其他的字母,所以没有用{}

在这里插入图片描述

在这里插入图片描述

字符串操作

  • 字符串截取

    格式:${字符串变量: 开始位置 : 截取的长度}

    其分左侧或右侧开始截图的具体写法

    左侧开始:${string: 0-start :length}
    右侧开始:${string: 0-start :length}
    
    左侧种格式相比,右侧种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。
    

    上面只是举例了一个,其实还有多个不同方式的截取

    格式 说明
    ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
    ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
    ${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
    ${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
    ${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
    ${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符
    ${string%*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
    ${string%%*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

    补充:得到字符串的长度

    str="abcd"
    echo  ${#str}
    #输出 4
    

Guess you like

Origin blog.csdn.net/u011863822/article/details/120801585