当前位置: 首页 > news >正文

Shell 运算符及语法结构

目录

一、Shell运算符

1.1 表达式expr 

1.2 运算操作

1.3 操作实例

二、Shell条件判断

2.1 基本语法

2.2 值、权限、类型、多条件判断

三、Shell流程控制

3.1 if 流程语法

3.2 case 流程语法

3.3 for 流程语法

3.4 内部运算符

3.5 while循环流程语法

四、Shell读取控制台输入

五、Shell函数

5.1 系统函数

5.2 自定义函数


一、Shell运算符

我们将Shell当成一门编程语言来学习,那么就一定需要有运算符
在Shell中,还存在 expr 表达式,可以用于做运算
在Shell中,运算需要使用 $((a+b)) 或者 $[a+b] 的形式

1.1 表达式expr 

命令符 expr是对应基础的加减乘除操作识别,但是乘法和除法前面要加反斜杠 ‘\’ ,并且运算符前后需要空格,如以下例子:

expr 10 + 5

expr 8 - 8

expr 2 \* 5

expr 6 \/ 3

1.2 运算操作

但是如果有同学说我们想要把这个值赋给一个变量应该怎么写,简单,直接用$替换即可,用法如下:

a=$(expr 10 +5)

a='expr 10 + 9' (×)

a=$((5+5))

a=$[5+8]

其中第二种方法相当于一个字符串了,linux并不会识别expr命令

1.3 操作实例

1、计算(3+8)*14的值

s=$[(3+8)*14]

 

2、创建 add.sh ,在执行的时候,通过传递参数的形式实现加法效果

#!/bin/bash
sum=$[$1 + $2]
echo sum=$sum

二、Shell条件判断

Shell中也有条件表达式,也就是比较两个值是否相等

2.1 基本语法

test 表达式 1
[ 表达式 ]  注意:中括号前后需要有空格

具体例子如下:

2.2 值、权限、类型、多条件判断

在条件判断中,除了相等于不等的判断,还有一些其他的判断

两个值比较

表达式                 含义                         表达式                 含义
-eq                       等于(equal)                 -ne                 不等于(not equal)
-lt                         小于(less than)           -le                  小于等于(less equal)
-gt                        大于(greater than)      -ge                 大于等于(greater equal)

文件权限判断

-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)

文件类型判断

-e 文件存在(existence)
-f 文件存在并且是一个文件类型(file)
-d 文件存在并且是一个目录类型(directory)

多条件判断

&& 与的关系,两者都成立
|| 或的关系,两者有一个成立

温馨提示

&& 表示前一个条命令执行成功之后,在执行第二个条件
|| 表示前一个条命令执行失败之后,再执行第二个条件
由此,我们可以衍生出来,类似三元运算符的形式

例如:加入我们想测试a是否等于b,如果等于则输出a=b,否则输出a!=b

[ $a -eq $b ] && echo '$a=$b' || echo "$a!=$b" 

三、Shell流程控制

流程控制语句是程序中的重点知识,掌握了流程控制语句,程序的基本架构就可以搭建起来了

3.1 if 流程语法

基本语法

if [ 条件判断 ]; then

        语句
fi

# 或者下面这种

if [ 条件判断 ]
then
        语句
fi

这只是单一的if,我们需要else的语法如下

if [ 条件判断 ]
then
        语句
else
        语句
fi

实例,比如说我们输入一个数,如果大于18则输出该岁数已经成年,反之则输出该岁数还未成年

#!/bin/bash
if [ $1 -gt 18 ]
then 
    echo '该岁数已经成年'
else
    echo '该岁数还未成年'
fi

要是else if那种语法呢,语法结构如下:

if [ 条件判断 ]
then
        语句
elif [ 条件判断 ]
then
        语句
else
        语句
fi

实例:比如说我们输入一个数,小于18则输出未成年,大于等于18小于35则输出青年人,大于等于35小于60则输出壮年人,否则输出老年人

#!/bin/bash
if [ $1 -lt 18 ]
then
    echo '未成年'
elif [ $1 -lt 35 ]
then
    echo '青年人'
elif [ $1 -lt 60 ]
then
    echo '壮年人'
else
    echo '老年人'
fi

3.2 case 流程语法

if 如果遇到多个条件,写起来会很麻烦,可以使用  case 改写;语法结构如下:

case $变量名 in
"值1")
        语句
;;
"值2")
        语句
;;
#...省略其他分支...
*)
        语句
;;
esac

注意事项

case行结尾必须为单词"in",每一个模式匹配必须以右括号")"结束
双分号 ";;" 表示命令序列结束,相当于跳出当前判断语句
最后 "*)" 表示默认模式结尾,不符合最终的出口 

例子:输入一个数,如果输入的是8,88,888则原样输出,否则输出为其他数字

#!/bin/bash
case $1 in
"8")
    echo $1
;;
"88")
    echo $1
;;
"888")
    echo $1
;;
*)
    echo '其他数字'
esac

3.3 for 流程语法

循环语句用于重复执行某个操作

for语句就是循环命令,可以指定循环的起点、终点和终止条件

不过for语句有两种不同写法,分别如下:

基本语法1:

for (( 初始值; 循环控制条件; 变量变化))
do
        语句
done

例子:比如说我们想计算1到100的累和,实现如下:

#!/bin/bash
for(( i=0;i<=100;i++ ))
do
    sum=$[$sum+$i];
done
echo $sum

基本语法2:

for 变量 in 值1 值2 值3...
do
        语句
done

例子:列举出linux,windows,macos等操作系统

#!/bin/bash
for os in linux windows macos
do
    echo $os
done

3.4 内部运算符

在shell中, {} 是内部运算符, {} 表示一个序列,例如,从1写到100:{1..100}

那么再用for的语法2来计算1-100的累和

#!/bin/bash
for i in {1..100}
do
    sum=$[$sum+$i]
done
echo $sum

$* 和 $@
$* 和 $@ 非常相似,都代表命令行所有的参数,但是 $* 把参数看成是一个整体,例如 123 456 。而 $@ 把每个参数区分对待,例如换行显示

例如下面这个例子,将输入的数用上述两种方式输出体现出他们的区别:

#!/bin/bash
echo "=====$*====="
for param in "$*"
do
    echo $param
done
echo "=====$@====="
for paprm in "$@"
do 
    echo $paprm
done

注意:在没有循环遍历时候,两者效果一致

3.5 while循环流程语法

循环语句除了 for 之外,还有一个 while 循环

基本语法

while [ 条件判断 ]
do
        语句
done

例子:比如说我们输入一个数,然后输出从1到该数的累和

#!/bin/bash
a=1
while [ $a -le $1 ]
do
    sum=$[$sum+$a]
    a=$[$a+1]
done
echo '1到'$1’的累和为:‘$sum

四、Shell读取控制台输入

读取控制台信息,既简单又很实用

基本语法

read 选项 参数 

选项:
-p:指定读取值时候的提示符
-t:指定读取值时候的等待时间(秒) 如果不添加  -t 表示一直等待
参数:
变量:指定读取值的变量名

例子如图:

假如我们让他只能等待两秒看看是否自动结束:

OK,确实如此,最后你们看到那个t其实是没有的,是因为我点击光标出现的提示符,并不是我的输入。

五、Shell函数

函数的本质就是一段可以反复调用的代码块
在Shell中,函数细分为系统函数和自定义函数

5.1 系统函数

我们可以测试一些系统命令,例如使用率非常高的  date ,我们还可以获取时间戳  date +%s
当我们需要打印写一些系统日志信息文件的时候,文件的命名规则通常在最后会添加上时间戳 

温馨提示
这里我们使用的系统命令(或者系统函数) date +%s 要进行命令替
换,也就是添加 $(date +%s)

例子:比如说我们用一个脚本,输入一个参数,并以该参数加入时间戳赋予一个变量,并将该变量输出显示:

#!/bin/bash
filename="$1_log_$(date +%s)"
echo $filename

其实我们可以把所有的系统命令当成是系统函数来调用

basename 函数
basename 的作用是获取文件名称,它会删除所有的前缀包括最后一个"/"字符,然后将字符串显示出来

语法如下:

basename [string/pathname][suffix] 

suffix为后缀,如果suffix被指定了,basename将会pathname或string中的suffix去掉,如下:

感觉这个函数其实就是获取文件名

现在我们回忆一下之前讲解的特殊变量 $n ,其中 $0 是获取当前名字,但是带有路径,我们只希望获取名字,所以可以通过 basename 去掉路径,甚至去掉后缀

看上图,就是可以成功获取到文件名字并且去除指定后缀

dirname函数
dirname 获取文件路径的绝对路径,从给定的包含绝对路径的文件名中去除文件名,然后返回剩余的路径

从上面这个图我们可以看得出这个函数注意就是将最后一个"/"及其后面的内容去掉,然后返回前面的内容

5.2 自定义函数

除了系统函数之外还有自定义函数,接下来我们看一下自定义函数如何实现

基本语法

function 函数名(){
// 函数体
return 返回值
}

温馨提示

必须在调用函数之前,先声明函数
函数返回值可以通过 $? 获取,但注意, $? 的值范围是0~255

例子:实现一个两个数值相加的函数

看上图,此时虽然实现了功能,但是如果此时用$?的话超于255的数就不正确了,因此我们可以用一个变量来存储返回值

#!/bin/bash
function add(){
    s=$[$1 + $2]
    echo $s
}
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
sum=$(add $a $b)
echo "a+b=" $sum

看上图我们可以知道,如果用return的话是无法获得返回值的,只能用echo。。。。

相关文章:

Shell 运算符及语法结构

目录 一、Shell运算符 1.1 表达式expr 1.2 运算操作 1.3 操作实例 二、Shell条件判断 2.1 基本语法 2.2 值、权限、类型、多条件判断 三、Shell流程控制 3.1 if 流程语法 3.2 case 流程语法 3.3 for 流程语法 3.4 内部运算符 3.5 while循环流程语法 四、Shell读…...

为什么要建前缀索引?

分析&回答 有一种与索引选择性有关的索引优化策略叫做前缀索引&#xff0c;就是用列的前缀代替整个列作为索引key&#xff0c;当前缀长度合适时&#xff0c;可以做到既使得前缀索引的选择性接近全列索引&#xff0c;同时因为索引key变短而减少了索引文件的大小和维护开销。…...

vite介绍

vite vite是一种新的前端构建工具&#xff0c;vite借助了浏览器对ESM的支持&#xff0c;采用和传统webpack打包完全不一致的unbundle打包机制&#xff1b; vite的快主要体现在两个方面&#xff0c;快速的冷启动和快速的热更新 快速的冷启动&#xff1a;vite只需启动一台静态页…...

2023年软件测试常见面试题

测试花费的成本&#xff0c;要深入在那个环节上&#xff0c;&#xff08;前提准备上&#xff0c;需求理解上&#xff0c;业务逻辑&#xff0c;排错上&#xff0c;业务名词上理解&#xff0c;通过什么样的方法&#xff0c;有谁能解决这样的问题&#xff09; 软性热身题 1.自我…...

关于const指针的一个常见误区

关于const&#xff0c;我曾因为其在C和C中的不同&#xff0c;还有一些编译器对未定义的处理不同&#xff0c;搞得晕头转向… 后来有次在阅读《C primer plus》中我终于梳理了有关const的结论。 1.const基础知识 首先要明白const的难点在于修饰指针的时候&#xff0c;对于con…...

@alilclowcode-engine-ext@1.0.5 不支持安装react@^16.3.0

alilclowcode-engine-ext1.0.5 不支持安装react^16.3.0 https://github.com/alibaba/lowcode-demo https://lowcode-engine.cn/site/docs/demoUsage/intro https://github.com/alibaba/lowcode-engine https://docs.appsmith.com/getting-started/setup/installation-guides?…...

Python之列表操作和内存模型

Python之列表操作和内存模型 列表list 一个排列整齐的队伍&#xff0c;Python采用顺序表实现 列表内的个体称作元素&#xff0c;由若干元素组成 列表 元素可以是任意对象(数字、字符串、对象、列表等) 列表内元素有顺序&#xff0c;可以使用索引 线性的数据结构 使用 [ ] …...

实习面试记录

湖南某操作系统中厂&#xff08;9月&#xff09; 首先是科研项目相关的问题&#xff0c;然后是其他问题如下&#xff1a; STL中&#xff0c;vector,map和unorded_map底层是怎么实现的&#xff1f; 在C标准库中&#xff0c;vector和map都是基于模板类实现的容器。 vector底层…...

总结/笔记-vue中的插槽(默认插槽、具名插槽、作用域插槽)

问题&#xff1a; 遇到了一个插槽&#xff0c;写法为 #default ”{ row }“ 插槽知识点&#xff1a; 定义 插槽&#xff0c;用于 在组件中 引用外部组件或自定义组件的内容。 即 子组件中提供给父组件使用的一个占位符&#xff0c;父组件可以在这个占位符中填充任何模板代…...

QTday5(QT连接TCP通信)

一、Xmind整理&#xff1a; C语言中的通信协议&#xff1a; 二、上课笔记整理&#xff1a; 1.QT中的服务器端的操作&#xff1a; .pro文件&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务…...

【Docker】安装RabbitMQ

1、拉取 RabbitMQ 镜像 docker pull rabbitmq2.创建并运行容器 docker run -it --name test-rabbitmq -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSuispig -p 15672:15672 -p 5672:5672 -d rabbitmq参数说明–name是 容器别名-d表示后台运行-p将 宿主机 5672端口…...

【如何获取数据库表的字段并拼接】

获取数据库表的字段并拼接 需求场景操作步骤获取该数据库对应表中所有的字段对获取到的字段进行处理 需求场景 在写sql语句时&#xff0c;我要获取到该表的大部门字段来做处理&#xff0c;一个个粘贴复制太费事了&#xff0c;所以我决定执行sql语句把表中字段查询出来 操作步…...

Oracle中LEFT JOIN后AND与WHERE的异同

1、AND 过滤之后再连接 2、WHERE 连接之后再过滤 下面以具体例子来说明&#xff1a; (1)、建表及插入测试数据 --建测试表 create table FACT_TAB ( ID INTEGER,STATUS VARCHAR2(8) ); create table DIM_STATUS ( STSTUS_CLASS VARCHAR2(8),STATUS_CODE VARCHAR2(8),S…...

Flink实时计算中台Kubernates功能改造点

背景 平台为数据开发人员提供基本的实时作业的管理功能,其中包括jar、sql等作业的在线开发;因此中台需要提供一个统一的SDK支持平台能够实现flink jar作业的发布;绝大多数情况下企业可能会考虑Flink On Yarn的这个发布模式,但是伴随云原生的呼声越来越大,一些企业不希望部…...

GO远程构建并调试

GO远程调试 之前写C&#xff0c;一直习惯了本地IDERemote CMake/GDB编译调试的模式。 因为6.824课程需要用GO&#xff0c;好像没有特别好的支持。记录一下如何配置调试的。 IDE: Goland 操作系统&#xff1a;Windows 远程服务器&#xff1a;Ubuntu 首先配置SSH,让其可以连接到…...

react使用hook封装一个search+input+checkbox组件

目录 react使用hook封装一个searchinputcheckbox组件searchPro.jsx使用组件效果 react使用hook封装一个searchinputcheckbox组件 searchPro.jsx import { Checkbox, Input } from "antd"; import React, { useEffect, useState } from "react"; import S…...

【6】uniform颜色写入

之前的Basic.shader: #shader vertex #version 330 corelayout(location 0) in vec4 position;void main() {gl_Position position; };#shader fragment #version 330 corelayout(location 0) out vec4 color;void main() {color vec4(1.0, 0.0, 0.0, 1.0); };这里color …...

自然语言处理历史史诗:NLP的范式演变与Python全实现

目录 一、引言什么是自然语言处理&#xff1f;语言与人类思维自然语言的复杂性NLP的历史轨迹 二、20世纪50年代末到60年代的初创期符号学派重要的研究和突破 随机学派重要的研究和突破 三、20世纪70年代到80年代的理性主义时代基于逻辑的范式重要的研究和突破 基于规则的范式重…...

网络协议从入门到底层原理学习(二)—— Mac地址/IP地址

文章目录 网络协议从入门到底层原理学习&#xff08;二&#xff09;—— Mac地址/IP地址1、MAC地址2、MAC地址的表示格式3、MAC地址表4、MAC地址操作5、MAC地址的获取6、ARP7、ICMP8、IP地址9、IP地址的分类和格式10、不同分类的IP地址的范围11、特殊 IP 地址12、子网掩码13、子…...

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...