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

Linux中阶教程:bash shell基础

文章目录

    • 输入输出
    • 赋值和计算
    • 条件判断
    • 函数
    • for 循环
    • 数组及其遍历
    • 其他控制语句

输入输出

echo表示打印字符串;read表示获取用户输入;$用于引用变量。

# test1.sh  bash中用#进行单行注释
echo "input your name:"
read user_name
echo "hello $user_name"

其运行结果为

$ bash test1.sh 
input your name:    #为echo打印
laser               #为用户输入
hello laser

赋值和计算

bash中的运算符并没有什么特殊的,

运算符说明
+-×/,%加减乘除,求余;支持+=形式
**&&||乘方、关系与、或

但是,与常见编程语言不同的是,bash中的赋值和数学计算需要在(())中进行。且在双括号内,不必使用$来引用变量。但在双括号外,在将数值赋给变量时需要使用$

$ ((a=5+3))
$ b = $((a+3))        #双括号内是数值,需要用$
#一般在C语言中合法的表达式均可用于双括号内
$ echo $((a>b ? a:b))
11

条件判断

bash中,条件判断通过[[]]来实现。例如

$ [[ 3 -eq 5 ]] #3是否等于5
$ echo $?       #$? 表示上次计算的结果
1               #在bash中,0表示真,其他表示假

需要注意,在bash中,0表示真。其支持的条件判断运算符如下

整数比较-eq-ne-gt-lt-ge-le
true条件相等不等左>右左<右左>=右左<=右
字符串比较><==!=, <>=~
true条件左>右左<右相等不等左匹配右(正则表达式)

其中,字符串比较的是字典顺序。

文件比较-nt-ot-ef
true条件左比右新左比右旧左右相同
true条件2左存在,右不存在左不存在,右存在

此外,bash还支持文件属性的判断,就操作系统而言,这是必须的。但就编程语言而言,这种针对文件交互的功能属于进阶内容,故而放在后面。

现在关键是学会条件判断的控制结构,bash和其他语言一样,采用了if作为关键字,同时采用fi作为条件结构结束的关键字。距离如下

$ ((a=15))
$ ((b=20))
$ if [[ a -le b ]]; then
> echo $a   #如果a<b则打印a
> else
> echo $b   #否则打印b
> fi
15

除了使用[[]]之外,还可通过test或者[],但适用范围有限,初学者只需掌握[[]]

函数

在编程语言中,函数的重要性是不言而喻的。在bash中,创建函数也十分简单,基本格式为

func(){# 传入参数用$1...$9表示return ...  #如果无返回值则不用return
}

其中func可换成函数的名称。在bash中,提供了一些有关函数的内置$参量,$1~$9可表示传入的参数,当参数位置大于10的时候,需写成类似${10}的形式。

由于已经讲解了判断表达式,故而下面就可以实现一个递归的阶乘函数了

#!/bin/bash
fac(){x=$1if [[ ${x} -eq 1 ]];thenecho "1"elseecho "$[$x * $(fac $[$x-1])]"fi
}res=$(fac $1)
echo "$1的阶乘是:${res}"

$表达式还有如下用法

$#参数个数
$*显示所有参数
$@显示所有参数,但使用时加引号,并在引号中返回每个参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$-显示Shell使用的当前选项,与set命令功能相同。
$?最后命令的退出状态,0表示无错误。

for 循环

在bash中,除了if else之外,还有case可用于条件选择。但对初学者而言,不必贪多,故而将学习case的优先级下调。

循环也是一样,尽管支持for、while、until等结构,但暂且放在后面,在此只需讲解最易理解的C语言风格的for循环。

其完整的结构是for do done

for ((i = 0 ; i <= 1000 ; i++)); doecho "Counter: $i"
done

其中,(())也可以理解为此前提到过的赋值与数学计算。而且不出意外地,bash中也同样支持continuebreak,前者可跳过当前的循环,后者可跳出循环。

bash中,其他循环结构同样是用do...done来规定循环区域。且当dofor等关键字在同一行时,需要用;隔开,如果另起一行,则不必写分号。

数组及其遍历

bash中,圆括号除了可以用于创建局部的shell,还可以用于构建数组。

$ arr=(A B "C" D)
$ echo $arr
A
$ echo ${arr[1]}
B
$ echo ${arr[*]}    #获取全部数组元素
A B C D

通过for…in语句,可以遍历数组,但需要注意,数组在被遍历时要通过@所以。

$ for var in "${arr[@]}"
> do
> echo $var
> done
A
B
C
D

此外,for循环还有更加便捷的遍历方案

$ for i in 1 2 3 4 5
> do
> echo $i
> done
1
2
3
4
5

其他控制语句

whileuntil在语法规则上是完全相同的,而在语义上则是完全相反的。前者执行到条件为false为止,后者则执行到条件为true为止。

a=0
# 下面的例子将打印从0到10的自然数
until [[ $a -gt 10 ]]doecho $aa=$((a+1))done

最后,bash还提供了多选语句,case…esac,其应用逻辑与switch case相同,具体示例如下

echo 'input a number:'
read num
case $num in1)  echo 'you input 1';;2)  echo 'you input 2';;*)  echo 'you input others';;
esac

其中,1), 2)表示出现的情况,;;相当于break,用以跳出case

至此便掌握了bash作为一门语言的基本语法。

相关文章:

Linux中阶教程:bash shell基础

文章目录 输入输出赋值和计算条件判断函数for 循环数组及其遍历其他控制语句 输入输出 echo表示打印字符串&#xff1b;read表示获取用户输入&#xff1b;$用于引用变量。 # test1.sh bash中用#进行单行注释 echo "input your name:" read user_name echo "h…...

Golang 编译原理

简介 Golang&#xff08;Go语言&#xff09;是一种开源的编程语言&#xff0c;由Google开发并于2009年首次发布。它具备高效、可靠的特性&#xff0c;被广泛应用于云计算、分布式系统、网络服务等领域。Golang的编译原理是理解和掌握这门语言的重要基础之一。本文将介绍Golang…...

基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别 计算机竞赛

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...

计算机视觉基础——基于yolov5-face算法的车牌检测

文章目录 车牌检测算法检测实现1.环境布置2.数据处理2.1 CCPD数据集介绍2.1.1 ccpd2019及20202.1.2 文件名字解析 2.2数据集处理2.2.1 CCPD数据处理2.2.2 CPRD数据集处理 2.3 检测算法2.3.1 数据配置car_plate.yaml2.3.2 模型配置2.3.3 train.py2.3.4 训练结果 2.4 部署2.4.1 p…...

【好书推荐】AI时代架构师修炼之道:ChatGPT让架构师插上翅膀

目录 前言 ChatGPT对架构师工作的帮助 快速理解和分析需求 提供代码建议和解决方案 辅助系统设计和优化 提高团队协作效率 如何使用ChatGPT提高架构师工作效率 了解用户需求和分析问题 编码实践和问题解决 系统设计和优化建议 团队协作和沟通效率提升 知识管理和文…...

全局代理和局部代理的区别

在计算机领域中&#xff0c;代理是一种常见的网络技术&#xff0c;它可以帮助用户更好地控制网络访问和数据传输。代理可以分为全局代理和局部代理两种&#xff0c;它们有着不同的作用和适用场景。 一、全局代理 全局代理指的是在系统级别设置的代理&#xff0c;它可以代理所…...

基于EPICS stream模块的直流电源的IOC控制程序实例

本实例程序实现了对优利德UDP6720系列直流电源的网络控制和访问&#xff0c;先在此介绍这个项目中使用的硬件&#xff1a; 1、UDP6721直流电源&#xff1a;受控设备 2、moxa串口服务器5150&#xff1a;将UDP6721直流电源设备串口连接转成网络连接 3、香橙派Zero3&#xff1a;运…...

Unity3D ECS架构适合作为主架构还是局部架构

前言 前言 Unity3D是一款广泛应用于游戏开发的跨平台游戏引擎&#xff0c;提供了丰富的功能和工具来简化游戏开发的过程。而Entity-Component-System&#xff08;ECS&#xff09;架构则是一种面向数据的设计模式&#xff0c;它将游戏对象&#xff08;Entity&#xff09;分解为…...

从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型

从零开始的目标检测和关键点检测&#xff08;三&#xff09;&#xff1a;训练一个Glue的RTMPose模型 一、重写config文件二、开始训练三、ncnn部署 从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 从零开始的目标检测和关键点检测…...

Qt6 中弹出消息框,一段时间后自动退出

以下代码功能&#xff0c;弹出模态消息框&#xff0c;然后&#xff0c;等待 3 秒&#xff0c;消息框自动退出 QMessageBox msgbox;msgbox.setText("sleep 3s");QTimer::singleShot(3000, &msgbox, &QMessageBox::close);msgbox.exec();...

elementUI树节点全选,反选,半选状态

// <template>部分 <div class"check-block"><el-divider></el-divider><el-checkbox :indeterminate"indeterminate" v-model"checkAll" change"handleCheckAllChange">全选</el-checkbox><e…...

Kafka、RabbitMQ、RocketMQ中间件的对比

消息中间件现在有不少&#xff0c;网上很多文章都对其做过对比&#xff0c;在这我对其做进一步总结与整理。 RocketMQ 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件&#xff0c;使用Mysql作为消息存储媒介&#xff0c;可完全水平扩容&#xff0c;为了进一步降低成…...

Mac 创建并使用 .zshrc 文件

1&#xff0c;打开终端输入指令 touch .zshrc 2&#xff0c;你可能希望将 .bash_profile 文件中的内容复制到 .zshrc 文件中&#xff0c;那建议复制过来。 3&#xff0c;使用 .zshrc 文件 执行以下指令&#xff1a; source .zshrc 注&#xff1a;以后希望使用 .bash_prof…...

Unity3D移动开发如何依据性能选择Shader

前言 在Unity3D移动开发中&#xff0c;选择合适的Shader是非常重要的&#xff0c;它直接影响到游戏的性能和画面效果。本文将介绍如何依据性能选择Shader&#xff0c;并给出相应的技术详解以及代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以…...

基于stm32F4的智能宠物喂食器的设计:LVGL界面、定时喂食喂水通风

宠物喂食器 一、功能设计二、元器件选型三、UI设计四、原理图设计五、源代码设计六、成品展示 实物链接&#xff1a;https://m.tb.cn/h.5iCUX6H?tkPL65WXCEipQ CZ3457 一、功能设计 1、设计一个触摸屏作为人机交互 2、通过触摸屏设置时间定时喂食喂水通风 3、获取当前水槽的…...

jumpserver堡垒机docker方式安装部署

1、环境要求 请先自行创建 数据库 和 Redis, 版本要求参考上面环境要求说明 mysql>5.7 redis >5.0 2、创建数据库 mysql&#xff1a; create database jumpserver default charset utf8; GRANT ALL PRIVILEGES ON jumpserver.* TO jumpserver% IDENTIFIED BY nu4x599…...

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

背景介绍 随着大数据技术的进步&#xff0c;企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法&#xff0c;有助于理解数据如何被转换和消费&#xff0c;同时对数据治理和合规性起到关…...

VScode clangd 插件浏览 linux 源码

文章目录 VScode clangd 插件浏览 linux 源码clangd 安装与配置VScode 插件安装clangd 安装方法一方法二 clangd 配置 cmake 生成bear 生成 compile_commands.json触发 clangd linux 内核脚本生成 compile_commands.json 文件三种方式对比 VScode clangd 插件浏览 linux 源码 …...

GZ035 5G组网与运维赛题第8套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第8套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…...

《golang设计模式》第三部分·行为型模式-02-命令模式(Command)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 命令模式&#xff08;Command&#xff09;将类的业务行为以对象的方式封装&#xff0c;以便实现行为的参数化、撤销或重做等需求。 非命令模式的困惑&#xff1a; 类的行为在运行时是以实例方法…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...