首页 > 系统相关 >Linux扩展篇-shell编程(三)-shell运算符

Linux扩展篇-shell编程(三)-shell运算符

时间:2023-06-27 20:57:55浏览次数:51  
标签:返回 shell 运算符 字符串 file Linux 如果 true

基本语法:

格式一

expr +、 -、 \*、/、 %(加、减、乘、除、求余)

格式二

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

基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符
  • 赋值运算符
  • 逻辑运算符
(1)算术运算符
运算符 说明 示例
+ 单目正号 ((+3))结果为3
- 单目负号 ((-3))结果为-3
++ 自增(变量前,先运算后取值;变量后,先取值后运算) b=2((a=++b))后a为3,b为3;((a=b++))后a为2,b为3
自减(变量前,先运算后取值;变量后,先取值后运算) b=2((a=--b))后a为1,b为1;((a=b--))后a为2,b为1
+ expr 3 + 2结果为5
- expr 3 - 2结果为1
* expr 3 \* 2结果为6
/ expr 3 / 2结果为1
% 取模 expr 3 % 2结果为1
** 幂运算 ((3**2))结果为9

expr可用于整数运算,也可以处理字符串,使用expr进行运算时,表达式和运算符之间必须加空格,乘号*和小括号()前要加\转义(小括号是左右括号前都要加\转义)。

(( expression ))会对算术表达式求值,如果表达式的值不是0,则返回状态是0,否则返回状态是1,这和let "expression"等价。

(( ))前面加上$符号可以获取(( ))命令的执行结果,即整个表达式的值。
(( ))只能进行整数运算,不能对浮点数或字符串进行运算。

(2)关系运算符

test[][[ ]]中使用的关系运算符:

运算符 说明 示例
-eq (equal)检测两个数是否相等,是返回0,否则返回1。 如果a为3,b为2,则[ ${a} -eq ${b} ]返回1
-ne (not equal)检测两个数是否不相等,是返回0,否则返回1。 如果a为3,b为2,则[ ${a} -ne ${b} ]返回0
-gt (greater than)检测左边的数是否大于右边的,是返回0,否则返回1。 如果a为3,b为2,则[ ${a} -gt ${b} ]返回0
-lt (less than)检测左边的数是否小于右边的,是返回0,否则返回1。 如果a为3,b为2,则[ ${a} -lt ${b} ]返回1
-ge (greater equal)检测左边的数是否大于等于右边的,是返回0,否则返回1。 如果a为3,b为2,则[ ${a} -ge ${b} ]返回0
-le (less equal)检测左边的数是否小于等于右边的,是返回0,否则返回1。 如果a为3,b为2,则[ ${a} -le ${b} ]返回1

在(())中使用的关系运算符:

运算符 说明 示例
== 检测两个数是否相等,是返回0,否则返回1。 如果a为3,b为2,则((a==b))返回1
!= 检测两个数是否不相等,是返回0,否则返回1。 如果a为3,b为2,则((a!=b))返回0
> 检测左边的数是否大于右边的,是返回0,否则返回1。 如果a为3,b为2,则((a>b))返回0
>= 检测左边的数是否大于等于右边的,是返回0,否则返回1。 如果a为3,b为2,则((a>=b))返回0
< 检测左边的数是否小于右边的,是返回0,否则返回1。 如果a为3,b为2,则((a<b))返回1
<= 检测左边的数是否小于等于右边的,是返回0,否则返回1。 如果a为3,b为2,则((a<=b))返回1

关系运算符只支持整数数字,不支持字符串,除非字符串的值是整数数字。注意(( ))中表达式的值不是0,返回状态才是0,否则返回状态是1,(( ))进行整数比较的时候表达式的值与(())返回状态正好相反,表达式的值为0,返回状态为1,表达式的值为1,返回状态为0。

(3)布尔运算符
运算符 说明 示例
-a 与运算,两个表达式都为true才返回true。 如果a为3,b为2,则[ ${a} -gt 1 -a ${b} -lt 1 ]返回false
-o 或运算,有一个表达式为true,则返回true。 如果a为3,b为2,则[ ${a} -gt 1 -o ${b} -lt 1 ]返回true
! 非运算,表达式为true,则返回false,否则返回true。 如果b为2,则[ ! ${b} -lt 1 ]返回true

-a-o)必须在[]中或配合test命令使用。

(4)字符串运算符

可以在test[][[ ]]中使用:

运算符 说明 示例
==、= 如果两个字符串相等,则为true。 如果a为"expression",b为"expansion",则[[ ${a} == ${b} ]]返回1
!= 如果两个字符串不相等,则为true。 如果a为"expression",b为"expansion",则[[ ${a} != ${b} ]]返回0
> 如果左边字符串在字典顺序上排在右边字符串之后,则为true。 如果a为"expression",b为"expansion",则[[ ${a} > ${b} ]]返回0
< 如果左边字符串在字典顺序上排在右边字符串之前,则为true。 如果a为"expression",b为"expansion",则[[ ${a} < ${b} ]]返回1
-z 如果字符串的长度为零,则为true。 如果a为"expression",则[[ -z ${a} ]]返回1
-n、string 如果字符串的长度不为零,则为true。 如果a为"expression",则[[ -n ${a} ]][[ ${a} ]]返回0

注意:

  • test[][[ ]]中使用字符串运算符===!=><只能比较字符串(只是字符串的值为数字时可以把它当成数字来比较,这只是字符串比较的结果与数值比较正好巧合,不推荐用它来比较数字,如[[ -3 < -2 ]]返回1,[[ 03 < 2 ]]返回0,[[ 1.5 == 1.50 ]]返回1,都是错误结果。
  • 如果要使用test[][[ ]]比较整数,需使用关系运算符-eq-ne-gt-lt-ge-le,推荐在(( ))中使用关系运算符==!=><>=<=进行整数比较。
  • test[]使用><需要加\转义,[[ ]]则不需要转义。
  • 使用test[][[ ]]则没有>=<=,可以通过[ ${a} \> ${b} -o ${a} == ${b} ][[ ${a} > ${b} || ${a} == ${b} ]]这种方式替代。
  • test[]会进行单词拆分,而[[ ]]不会进行单词拆分。
  • 当与[[ ]]一起使用时,<>使用当前区域设置按字典顺序排序,test命令使用ASCII排序。
(5)文件测试运算符
运算符 说明 示例
-a file 如果文件存在,则为true。 [ -a ${file} ]
-b file 如果文件存在并且是个块设备文件,则为true。 [ -b ${file} ]
-c file 如果文件存在并且是个字符设备文件,则为true。 [ -c ${file} ]
-d file 如果文件存在并且是个目录,则为true。 [ -d ${file} ]
-e file 如果文件存在,则为true。 [ -e ${file} ]
-f file 如果文件存在并且是个普通文件(既不是目录也不是设备文件),则为true。 [ -f ${file} ]
-g file 如果文件存在并且设置了set-group-id位,则为true。 [ -g ${file} ]
-h file、-L file 如果文件存在并且是个符号链接,则为true。 [ -h ${file} ]
-k file 如果文件存在并且设置了“sticky”位,则为true。 [ -k ${file} ]
-p file 如果文件存在并且是个命名管道(FIFO),则为true。 [ -p ${file} ]
-r file 如果文件存在并且可读,则为true。 [ -r ${file} ]
-s file 如果文件存在并且大小大于0,则为true。 [ -s ${file} ]
-u file 如果文件存在并且设置了set-user-id位,则为true。 [ -u ${file} ]
-w file 如果文件存在并且可写,则为true。 [ -w ${file} ]
-x file 如果文件存在并且可执行,则为true。 [ -x ${file} ]
-G file 如果文件存在并且被有效组id所拥有,则为true。 [ -G ${file} ]
-N file 如果文件存在并且自上次读取后被修改,则为true。 [ -N ${file} ]
-O file 如果文件存在并且被有效用户id所拥有,则为true。 [ -O ${file} ]
-S file 如果文件存在并且是个套接字,则为true。 [ -S ${file} ]
file1 -ef file2 如果file1和file2指向相同的设备和inode号,则为true。 [ ${file1} -ef ${file2} ]
file1 -nt file2 如果file1比file2更新(根据修改日期),或者file1存在而file2不存在,则为true。 [ ${file1} -nt ${file2} ]
file1 -ot file2 如果file1比file2更旧,或者file2存在而file1不存在,则为true [ ${file1} -ot ${file2} ]
(6)赋值运算符
运算符 说明 示例
= 赋值 c=3 a=${c}则a为3
+= 加赋值 如果a为3,b为2,则((a+=b))后a为5,b为2
-= 减赋值 如果a为3,b为2,则((a-=b))后a为1,b为2
*= 乘赋值 如果a为3,b为2,则((a*=b))后a为6,b为2
/= 除赋值 如果a为3,b为2,则((a/=b))后a为1,b为2
%= 取模赋值 如果a为3,b为2,则((a%=b))后a为1,b为2
<<= 左移位赋值 如果a为3,b为2,则((a<<=b))后a为12,b为2
>>= 右移位赋值 如果a为3,b为2,则((a>>=b))后a为0,b为2
&= 按位与赋值 如果a为3,b为2,则((a&=b))后a为2,b为2
|= 按位或赋值 如果a为3,b为2,则((a|=b))后a为3,b为2
^= 按位异或赋值 如果a为3,b为2,则((a^=b))后a为1,b为2

可以使用(( ))let命令进行运算,let(( ))用法类似,都是用于整数运算。

(7)逻辑运算符
运算符 说明 示例
&& 逻辑与 如果a为3,b为2,则[[ ${a} > 1 && ${b} < 1 ]]返回false
|| 逻辑或 如果a为3,b为2,则`[[ ${a} > 1
! 逻辑非 如果b为2,则[[ ! ${b} < 1 ]]返回true

&&||可以在[[ ]](( ))中使用,不能在test[]中使用,!可以在[[ ]]中使用,不能在(( ))中使用。

(8)位运算符
运算符 说明 示例
<< 左移位 ((3<<2))结果为12
>> 右移位 ((6>>2))结果为1
& 按位与 ((6&3))结果为2
| 按位或 `((6
^ 按位异或 ((6^3))结果为5
~ 按位非 ((~6))结果为-7

实践

https://www.runoob.com/linux/linux-shell-basic-operators.html

标签:返回,shell,运算符,字符串,file,Linux,如果,true
From: https://www.cnblogs.com/cavan2021/p/17483981.html

相关文章

  • 最小的linux发行版本
     TinyCoreLinux    TinyCoreLinux,MicroCoreLinux,17MBLinuxGUI桌面,live,节俭,可扩展    SliTaz         SliTazGNU/Linux(en)  适用于老旧设备的七款轻量级Linux发行版-系统极客(sysgeek.cn) ......
  • Linux安装与配置FTP服务
    1、FTP安装与配置1.1、FTP安装一般使用yum直接在线安装#在线安装FTPyuminstall-yvsftpd安装完成后查看ftp状态#查看ftp状态systemctlstatusvsftpd.service#启动ftp状态重启:restart,停止:stop,开机自启:enable,关闭开机自启:disablesystemctlstartvsftpd.service1.2......
  • Linux系统之Drone配置文件
    /usr/local/bindrone.ymlversion:'3'networks:mxy:external:falseservices:#容器名称drone-server:container_name:drone#构建所使用的镜像image:drone/drone#映射容器内80端口到宿主机的8069端口,若修改的话,那么上面Gitee上也需要......
  • jmeter beashell调用python3脚本并获取python输出值
    test3.py代码如下: beashell代码如下:importjava.io.BufferedReader;importjava.io.InputStreamReader;Stringcommand="cmd/cpythonD://个人//test3.py";Runtimert=Runtime.getRuntime();Processpr=rt.exec(command);pr.waitFor();BufferedRead......
  • Linux系统下安装vscode
    正点原子安装视频 跟着教程一步步来即可,但是看视频太麻烦了,写个博客做个记录前往vscode官网下载linux版本vscode链接在这 可以将连接复制到linux下进行下载,windows传过去也怪麻烦的我采用的是Ubuntu因此下载.dep文件  打开所在文件夹通过终端控制指令进行安装,如下代码:......
  • Linux定时备份数据库
    一、mysql命令备份①创建存放mysql备份的文件夹backup②创建backup.sh备份脚本③赋予权限chmodu+xbackup.sh#!/bin/bash#全备方式,一般在从机上执行,适用于小中型mysql数据库#删除7天以前备份source/etc/profile#加载系统环境变量source~/.bash_profile......
  • Linux系统编程21-简单的more命令实现
    /dev/tty:键盘和显示器设备描述文件向该文件写->显示在用户屏幕向该文件读->从键盘获取用户输入当more需要用户输入可以从/dev/tty得到数据#include<stdio.h>#include<stdlib.h>#definePAGELEN24#defineLINELEN512voiddo_more(FILE*);intsee_more(FILE*);......
  • windows和linux环境下安装jprofiler
    Windows安装jprofiler一.windows安装和激活1.首页默认,直点击下一步2.同意授权3.进入注册页面4.在注册页面输入用户和密钥5.打开注册机,点击generate生成账号和密钥6.把licensekey输入到步骤一中的密钥框,公司名字可以顺便写7.直接点击下一步,完成安装二.Linux安装1.......
  • 初识Quantum Mini Linux Development Kit
    本人近期看到稚晖君的Linux-card的相关视频介绍,看到它极大的方便,整体只需Type-C即可供电并且算力满足目前所需要求功能也不少。于是火速下单,从SpeedStudio购入。到货后先认识这个开发套件的外观,可以说是非常小巧,功能接口也不少,可以满足大部分需求。      ......
  • linux vim常用快捷键
    linuxvim常用快捷键行尾插入:A行首插入:I光标后插入:a光标前插入:i往下插入空行:o往上插入空行:O定位整个文本第一行:gg定位整个文本最后一行:G定位某行:比如定位21行::21或21gg或21G复制整行:yy粘贴:p往下复制3行:3yy复制单个字符:v模式——y复制——p粘贴删除整行:dd往下删......