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作为一门语言的基本语法。

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

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

相关文章

软件测试报告所需周期和费用简析

软件测试报告是在软件开发和测试过程中生成的重要文档之一。它提供了对软件系统经过全面测试后的状态和质量的详细描述&#xff0c;以记录软件测试的过程和结果。 生成一个完整的测试报告需要根据软件项目的规模和复杂性来确定时间。较大规模和复杂的软件项目可能需要更长的时…

【华为OD题库-002】需要打开多少监视器-Java

题目 某长方形停车场&#xff0c;每个车位上方都有对应监控器&#xff0c;当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时&#xff0c;监控器才需要打开: 给出某一时刻停车场的停车分布&#xff0c;请统计最少需要打开多少个监控器 输入描述 第一行输入m&#…

【错误解决方案】ModuleNotFoundError: No module named ‘feather‘

1. 错误提示 在python程序中&#xff0c;尝试导入一个名为feather的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named feather 2. 解决方案 出现这种情况&#xff0c;有可能是因为你还没有安装这个模块&#xff0c;…

MFC简单字符串压缩程序

一个mfc简单字符串压缩程序;按以下情况进行压缩; 1 仅压缩连续重复出现的字符。比如”abcbc”无连续重复字符,压缩后还是”abcbc”。 2 压缩的格式为”字符重复的次数+字符”。例如,”xxxyyyyyyz”压缩后就成为”3x6yz”。 void CYssDlg::OnButton1() {// TODO: Add you…

是否会有 GPT-5 的发布?

本心、输入输出、结果 文章目录 是否会有 GPT-5 的发布?前言围绕 GPT-5 的信息OpenAI 期待增长GPT-5 - 到底是真的在训练,还是一个虚构的故事Sam Altman字里行间包含的信息我们在什么时候可以期待 GPT-5 的发布GPT-5 预计将在哪些方向努力GPT-5 在听觉领域GPT-5 在视频处理领…

Flutter 小技巧之不一样的思路实现炫酷 3D 翻页折叠动画

今天聊一个比较有意思的 Flutter 动画实现&#xff0c;如果需要实现一个如下图的 3D 折叠动画效果&#xff0c;你会选择通过什么方式&#xff1f; 相信可能很多人第一想法就是&#xff1a;在 Dart 里通过矩阵变换配合 Canvas 实现。 因为这个效果其实也算「常见」&#xff0c;…

使用 PyTorch 构建自定义 GPT

一、介绍 介绍大模型&#xff0c;首先考虑一下使用 ChatGPT、Bing Chat 或 Bard 。您是否想过拥有自己的 ChatGPT 会是什么样子&#xff1f;想象一下创建自己的 GPT 模型的兴奋程度。这确实是一种难以置信的感觉&#xff01; 为了开始构建自定义 GPT 的旅程&#xff0c;让我们仔…

python中dict的使用——如何将列表转化为字典

代码1和代码2的作用都是将列表转化为dict&#xff0c;但是很明显代码2的代码更加简洁 代码1&#xff1a; word_2_onehot {} dic["A","B","C","D"] for d,s in enumerate(dic):word_2_onehot[s]d print(word_2_onehot) #结果为&#…

MATLAB和S7-1200PLC OPC通信(激活S7-1200PLC OPC UA服务器)

MATLAB和SMART PLC OPC通信请参考下面文章博客: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读123次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的opc通信_RXXW_Dor的博客-CSDN博客OPC是…

Kotlin 操作集合的高阶函数

Kotlin 提供了很多高阶函数用于对集合进行操作和转换。以下是一些常用的高阶函数&#xff1a; forEach{}&#xff1a;对集合中的每个元素执行指定的操作&#xff0c;无返回值。map{}&#xff1a;对集合中的每个元素执行指定的操作&#xff0c;返回操作后的集合filter{}&#x…

vue使用antv-x6 绘制流程图DAG图

注册节点两种方法&#xff1a; import { Graph, Node, Path, Cell, Addon } from "antv/x6"; import { register } from "antv/x6-vue-shape"; 1.x 的写法&#xff1a; registerCustomNode() {// demoGraph.registerNode("custom-polygon",{…

通讯网关软件032——利用CommGate X2OPC实现OPC客户端访问Modbus TCP设备

本文介绍利用CommGate X2OPC实现OPC客户端连接Modbus TCP设备。CommGate X2OPC是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统上位机、PLC、设备具备Modbus TCP通讯接口&#xff…

机器学习2:决策树--基于信息增益的ID3算法

1.决策树的简介 建立决策树的过程可以分为以下几个步骤: 计算每个特征的信息增益或信息增益比,选择最优的特征作为当前节点的划分标准。根据选择的特征将数据集划分为不同的子集。对每个子集递归执行步骤 1 和步骤 2,直到满足终止条件。构建决策树,并输出。基于信息增益的…

k8s调度约束

List-Watch Kubernetes 是通过 List-Watch的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 List-Watch机制 工作机制&#xff1a;用户通过 kubectl请求给 APIServer 来建立一个 Pod。APIServer会将Pod相关元信息存入 etcd 中…

移动路由器Cellular Router命令执行漏洞复现 [附POC]

文章目录 移动路由器Cellular Router命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 移动路由器Cellular Router命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章…

SQL面试

#(1)请写出要查询员工J开头的名字其工号(EMPNO)及部门名称(DEPTNA)的 SQL语句SELECT e.emp,e.name,d.deptna FROM emp e left join dept d on d.deptno e.deptno where e.name like J%#(2)请写出要查询 Kevin 所在部门的部门代号(DEPTNO)及部门名称(DEPTNA)的 SQL 语句SELECT e…

Pure-Pursuit 跟踪双移线 Gazebo 仿真

Pure-Pursuit 跟踪双移线 Gazebo 仿真 主要参考学习下面的博客和开源项目 自动驾驶规划控制&#xff08;&#xff21;*、pure pursuit、LQR算法&#xff0c;使用c在ubuntu和ros环境下实现&#xff09; https://github.com/NeXTzhao/planning Pure-Pursuit 的理论基础见今年六月…

如何巧妙公布成绩

宝子们&#xff0c;来来来&#xff01;听说你们对如何公布学生成绩很头疼&#xff1f;别担心&#xff0c;今天就让我来给大家支支招&#xff01; 1在家长群内发公告&#xff0c;孩子的成绩已出&#xff0c;想知道具体成绩可以私信哦&#xff5e;简单粗暴&#xff01;关心孩子的…

autoFac 程序集注册 简单试验

1.概要 要实现批量注册的时候&#xff0c;也可以使用程序集的方式来注册。 2.代码 2.1 主函数 using Autofac; using ClassLibrary1.IF; using System; using System.Reflection;namespace AutoFac程序集注册 {class Program{static void Main(string[] args){Console.Writ…

Flutter之GetX controller tag使用详解

本文主要介绍 GetX 依赖注入中 tag 的作用和使用详解。 作用 前面几篇文章介绍了 GetX 依赖注入的使用以及通过源码剖析了依赖注入的原理&#xff1a; •《Flutter应用框架搭建(一)GetX集成及使用详解》•《Flutter 通过源码一步一步剖析 Getx 依赖管理的实现》•《Flutter之…