Linux学习笔记-shell运算符

1、算术运算符

shell支持各种算术运算符(不列举了),但是原生的bash不支持数学运算,只能通过其他命令来实现,比如awk和expr,后者最常用。使用时需要注意:

  1. 使用expr配合echo时要注意用反引号`不是引号。
  2. 进行运算时,两个表达式和运算符之间要有空格。

如下表格展示了一些表达式(一些太简单跟java差不多的就不列举了)

|-----|-------------------------|-----------------------------------------------------------------|
| 运算符 | 说明 | 示例 |
| * | 乘法 | `expr a \\\* b`,*前需要加反斜杠转义。 |
| == | 相等。用于比较两个数字,相同则返回 true。 | `expr a == b`,如果用在if语句中,就是if $a == $b ,其中方括号和变量之间要有空格。 |

具体代码示例:

运行结果:

2、关系运算符

注意如下运算符只能在if语句中搭配\[\]使用。

|-----|--------------|
| 运算符 | 说明 |
| -eq | 判断是否相等 |
| -ne | 判断是否不相等 |
| -lt | 判断左边是否小于右边 |
| -gt | 判断左边是否大于右边 |
| -le | 判断左边是否小于等于右边 |
| -ge | 判断左边是否大于等于右边 |

使用示例:

结果:

3、布尔运算符

|------------|-----|-----------------------------------------|
| 运算符 | 说明 | 举例 |
| ! | 非运算 | ! $a == $b 表示是否不相等 |
| -o或者直接|| | 或运算 | $a != $b -o $c != $d 表示是否两个至少一个不相等 |
| -a或者直接&& | 与运算 | 与上面类似 |

示例:

运行结果:

4、字符串运算符

|-----|--------------|----------------|
| 运算符 | 说明 | 举例 |
| = | 判断两个字符串是否相等 | $a = $b |
| != | 判断是否不相等 | $a != $b |
| -z | 判断字符串长度是否为0 | -z $a |
| -n | 判断字符串长度是否不为0 | -n $a |
| | 判断字符串是否为空 | \[ a ] |

示例:

结果:

5、文件测试运算符

如下命令都需要搭配if语句

|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 操作符 | 说明 |
| -b file | 检测文件是否为块设备文件,是硬盘、虚拟机磁盘等硬件设备在文件系统的代表。 |
| -c file | 检测文件是否为字符设备文件,是鼠标、键盘、声卡等设备在文件系统中的代表。 |
| -d file | 检测文件是否为一个文件夹。 |
| -f file | 检测文件是否为普通文件 |
| -g file | 检测文件是否设置了SGID位,它的这个设计思想很有意思,因此我详细展开一下。 首先一个文件它只能有一个所属组,一个用户除了有所属的主组之外,还可以有附加组。也就是说一个用户可以有多个组。 文件,如果安全性要求很高,其他用户(o)不具备任何权限。比如需要进行用户密码修改,密码所在的文件,其他用户并不具备修改权限。又不能每次都让密码文件所在组成员去帮忙修改密码、再加上一个文件只能属于一个组,不可随意修改。 因此只能使用某种机制,让其他组成员能在受限制的情况下,临时访问高级权限文件。比如密码修改,就让root用户创建并提供一个修改密码的脚本,授予其他用户可执行权限,并且让执行者在执行这个脚本时,在脚本内临时具有对密码文件的修改权限,执行结束后,该权限自动消失。 这样既不破坏原有权限体系,还能完成这种访问受限文件的需求。这种机制就是SGID或者SUID(临时获得文件所有者的权限)。 SGID位作用: 如果用于可执行文件,那么可执行文件的执行者,临时获得这个文件所属组对所有文件的权限(文件所属组和文件持有者所在组完全不同)。 如果用于目录,在该目录下新建的文件,自动继承该目录的所属组,而不是继承创建者的默认组。 |
| -k file | 检测文件是否设置了粘着位。它的核心作用是防止用户在共享目录(比如权限777的目录)下删除或重命名非自己拥有的文件。 |
| -p file | 检测文件是否是有名管道。"有名管道"是一种用于进程间通信的特殊文件类型,用来让两个不相关的进程交换数据。也就是一个负责写一个负责读,像是通道。 |
| -u file | 检测文件是否设置了 SUID 位 |
| -r file | 检测文件是否可读 |
| -w file | 是否可写 |
| -x file | 是否可执行 |
| -s file | 检测文件是否不为空 |
| -e file | 检测文件是否存在 |

示例(这里我只测试-s和-e操作符):

结果:

6、自增自减运算符

linux可以通过如下两种形式实现自增和自减。一种是直接i++,可以通过let命令和(())实现。一种是直接令i=i+1,可以通过$(( ))和expr实现。

6.1 直接的自增

直接使用++或者--这种运算符,与java类似。例如:

let i++

((i++))

let 示例:

结果:

(()) 示例:

结果:

6.2 间接的自增

也就是让num=num+1,进行间接的自增。分为$(( ))和expr命令,例如:

num=$((num+1))

num=(expr {num} + 1)

$(( ))示例:

结果:

expr示例:

结果:

相关推荐
其实防守也摸鱼1 小时前
渗透--损坏的对象级别鉴权漏洞(Broken Object Level Authorization, BOLA)
大数据·网络·数据库·学习·tcp/ip·安全·安全威胁分析
hehelm1 小时前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++
铅笔侠_小龙虾2 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
降临-max2 小时前
软件测试基础---项目实战
软件测试·笔记·功能测试·测试用例
it小生01012 小时前
从底层思维到高效行动,顶尖人才进阶核心修炼指南
学习·学习方法
浅止菌2 小时前
嵌入式项目Makefile越写越乱?一张万能模板+5个技巧,告别重复劳动
linux
恣逍信点2 小时前
《凌微经》通俗解读——哲学第一因
学习·职场和发展·创业创新·学习方法·业界资讯·交友·哲学
鱼子星_3 小时前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记
red_redemption3 小时前
自由学习记录(207)
学习