当前位置: 首页 > 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开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...