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。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将两个pdf合并成一个?pdf合并技巧分享

在日常工作过程当中&#xff0c;我们经常需要处理一些文件&#xff0c;而文件的处理往往是琐碎的&#xff0c;想要提高工作效率&#xff0c;需要选择一些合适的方法&#xff0c;并掌握一定的技巧&#xff0c;那么&#xff0c;如何将两个pdf合并成一个?pdf合并技巧有哪些呢?接…

AFG EDI 解决方案

AFG一直是汽车行业出境物流的专家&#xff0c;不仅运输汽车&#xff0c;同时也提供模块化IT解决方案&#xff0c;用于接收、控制、互联以及整个车辆调度过程的可视化和监控。 对于物流行业而言&#xff0c;如果已经确定了供应链整合的目标&#xff0c;但却没有明确的计划及足够…

mac下配置JDK环境

一、下载安装 下载地址&#xff1a;Java Downloads | Oracle&#xff0c;选择适用于Mac OS的JDK版本&#xff0c;点击下载即可。 下载完之后&#xff0c;直接安装&#xff1a; 安装过程非常简单&#xff0c;按“继续”按钮一直下一步即可。 二、配置环境变量 上一步骤&#x…

Opencv 图像金字塔----高斯和拉普拉斯

原文&#xff1a;图像金字塔----高斯和拉普拉斯 图像金字塔是图像中多尺度表达的一种&#xff0c;最初用于机器视觉和图像压缩&#xff0c;最主要用于图像的分割、融合。 高斯金字塔 ( Gaussian pyramid): 高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像…

企微SCRM营销平台MarketGo-ChatGPT助力私域运营

一、前言 ChatGPT是由OpenAI&#xff08;开放人工智能&#xff09;研发的自然语言处理模型&#xff0c;其全称为"Conversational Generative Pre-trained Transformer"&#xff0c;即对话式预训练转换器。它是GPT系列模型的最新版本&#xff0c;GPT全称为"Gene…

指针进阶(一)

指针进阶 1. 字符指针面试题 2. 指针数组3. 数组指针3.1 数组指针的定义3.2 &数组名VS数组名 3.3 数组指针的使用4. 数组传参和指针传参4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 前言 指针的主题&#xff0c;我们在初级阶段的《指针》章节已经接…

NLP(2)--Transformer

目录 一、Transformer概述 二、输入和输出 三、Encoder 四、Decoder 五、正则化处理 六、对于结构的改进&#xff1f; 七、AT vs NAT 八、Cross-attention 一、Transformer概述 Transformer模型发表于2017年Google团队的Attention is All you need这篇论文&#xff0c;…

蓝桥杯打卡Day1

文章目录 全排列八皇后 一、全排列IO链接 本题思路:本题是一道经典的全排列问题&#xff0c;深度优先搜索即可解决。 #include <bits/stdc.h>constexpr int N10;std::string s; std::string ans; int n; bool st[N];void dfs(int u) {if(un){std::cout<<ans<…

前后端数据加密传输基于AES+RSA实现

前后端数据加密传输基于AESRSA实现 什么是AES和RSA AES AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;它的加密速度快&#xff0c;安全性也比较高&#xff0c;是目前广泛使用的加密算法之一。AES的密钥长度可以选择128位、192位和…

NetSuite海鲜书 - 知识会汇编 用户篇 2023

NetSuite2021年初夏&#xff0c;NetSuite知识会成立。它由本人&#xff0c;上海德之匠信息技术有限公司的毛岩喆&#xff08;江湖人称Rick&#xff09;发起建立。建立的初衷秉承Rick个人博客“学问思辨&#xff0c;企业信息化路上的行者”的理念&#xff0c;期望能够在NetSuite…

Flink基础

Flink architecture job manager is master task managers are workers task slot is a unit of resource in cluster, number of slot is equal to number of cores(超线程则slot2*cores), slot一组内存一些线程共享CPU when starting a cluster,job manager will allocate a …

docker快速安装-docker一键安装脚本

1.下载/配置安装脚本 touch install-docker.sh #!/bin/bash #mail:ratelcloudqq.com #system:centos7 #integration: docker-latestclear echo "######################################################" echo "# Auto Install Docker …

大数据组件-Flume集群环境搭建

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

AOP到底是啥

AOP到底是啥 前言面向切面编程到底是啥意思那么要怎么实现面向切面编程呢&#xff1f;成果 前言 回忆起来&#xff0c;第一次听到这三字母是博主在上大二的时候&#xff0c;那时候看的一脸懵逼&#xff0c;现在马上研二了才想起来回顾下。 只记得当时面向对象编程还没整明白&…

TDengine(2):wsl2+ubuntu20.04+TDengine安装

一、ubuntu系统下提供了三种安装TDengine的方式&#xff1a; 二、通过 apt 指令安装失败 因为是linux初学者&#xff0c;对apt 指令较为熟悉&#xff0c;因此首先使用了该方式进行安装。 wget -qO - http://repos.taosdata.com/tdengine.key | sudo apt-key add -echo "…

【Linux】文件

Linux 文件 什么叫文件C语言视角下文件的操作文件的打开与关闭文件的写操作文件的读操作 & cat命令模拟实现 文件操作的系统接口open & closewriteread 文件描述符进程与文件的关系重定向问题Linux下一切皆文件的认识文件缓冲区缓冲区的刷新策略 stuout & stderr 什…

STM32 硬件IIC 控制OLED I2C卡死问题

#更新通知&#xff1a;2023-09-06 STM32L151 固件库 使用I2C 太难了&#xff0c;又宕机了&#xff0c;建议不要在固件库版本上尝试硬件IIC 了&#xff0c;一般人真用不了&#xff0c;直接使用软件模拟的&#xff0c;或者不要使用固件库了&#xff0c;用HAL 库吧&#xff0c;据说…

既要炫酷好看,又要出图快?可视化大屏模板了解下!

可视化大屏模板可以在很大程度上满足炫酷好看和出图快的需求。使用模板可以节约制作时间&#xff0c;像奥威BI系统就上线了大量的可视化大屏模板。这些模板实际上都是一张张完整的可视化大屏报表&#xff0c;从数据源到数据分析模型&#xff0c;再到数据可视化图表和智能分析功…

《vue3实战》运用push()方法实现电影评价系统的添加功能

目录 前言 电影评价系统的添加功能是什么&#xff1f; 电影评价系统的添加功能有什么作用&#xff1f; 一、push&#xff08;&#xff09;方法是什么&#xff1f;它有什么作用&#xff1f; 含义&#xff1a; 作用&#xff1a; 二、功能实现 这段是添加开始时点击按钮使…

支持CAN FD的Kvaser PCIEcan 4xCAN v2编码: 73-30130-01414-5如何应用?

这里是引用 Kvaser PCIEcan 4xCAN v2&#xff08;编码: 73-30130-01414-5&#xff09;是一款小巧而先进的多通道实时CAN接口&#xff0c;可发送和接收CAN总线上的标准和扩展CAN消息&#xff0c;时间戳精度高。其与所有使用Kvaser CANlib的应用程序兼容。 主要特性 PCI Express…