Bash编程

目录:

  1. bash编程语法
  2. bash脚本编写

1.bash编程语法

Bash 编程基础

  • 变量
  • 引号
  • 数组
  • 控制语句
  • 函数

Bash 变量

语法: Variable_name=value

Bash 变量定义的规则

  • 变量名区分大小写,a和A为两个不同的变量。
  • 变量名可以使用大小写字母混编的形式进行编写。
  • 变量名与值之间的=两侧都不能有空格。
  • 在读取或打印变量时,需使用$+变量名。
  • 变量可以写在Bash脚本中的任何地方,在运行时,Bash会自动将其替换为变量值。

 Bash 数据类型

在 Bash 中声明变量后赋值,它会自动判断数据类型,不必在声明的同时去定义变量的数据类型。

Bash 变量的类型

  • 系统定义的变量
    • 通常是以大写字母形式存在
    • 如 BASH、SHELL等
  • 用户定义的变量
    • 多数以小写字母参与命名
    • 但不具有大小写强制性规定

 Bash 变量的定义与使用

letter_name="abc"

echo $letter_name 

 只读变量

a="123"

readonly a

删除变量

unset Variable_name

变量类型 

字符串: your_name="Tom"
拼接字符串: greeting="hello, ${your_name},hello,hello"

数组array name=(value0 value1 value2 value3)

  • 取数组valuen=${array_name[n]}
  • 单独赋值array name[0]=value0

 字符串的拼接

基本语法 str3="${str1}${str2}"

 Bash 引号

  • 输入的内容为简单的字符串或文本时,单引号和双引号的作用没有任何区别
  • 输出一个已定义的变量,则需要使用双引号

数组

数组可以定义为相似类型元素的集合,在bash中数组不必是相似类型元素的集合

数组初始化

  • my_array=(A B "C" D)
  • echo "第一个元素为:${my_array[0]}"

数组单个定义

  • my_array[1]=B
  • echo "数组的元素为: ${my_array[*]}"
  • echo "数组的元素为: ${my_array[@]}" 

索引数组的声明和赋值

declare -a Array_Name

# 索引数组

Array_Name[index_1]=value_1

Array_Name[index_2]=value_2

Array_Name=( [index_1]=value_1 [index_2]=value_2 )

关联数组的声明和赋值

declare -A Array_Name

# 关联数组

Array_Name[name1]=value_1

Array_Name[name2]=value_2

Array_Name=( [name1]=value_1 [name2]=value_2 )

数组的访问 

declare -a arr1=( hello world )

echo ${arr1[0]}

declare -A arr2=( [key1]=hello [key2]=world )

echo ${arr2[key1]}

取出所有元素 

declare -a arr=( hello world )

echo ${arr[@]}

echo ${arr[*]}

数组的长度 

declare -a arr=( hello world )

echo "arr length is ${#arr[@]}"

向数组中添加元素 

declare -a arr=( hello world )

arr+=(Tom)

arr[5]=harry

echo ${arr[*]}

输出索引 

declare -a arr=( hello world )

arr+=(Tom) arr[5]=harry

echo "arr indexs is ${!arr[@]}"

控制语句 if 

# 单条件

if [ expression ];

then statements fi

# 多条件与

if [ expression_1 ] && [ expression_2 ];

then statements fi

# 多条件或

if [ expression_1 ] || [ expression_2 ];

then statements fi

# 多分支

if [ expression_1 ] ;

then statements

elif [ expression_2 ] ;

then statements

else

statements fi

循环语句 for 

for variable in list

do

commands

done

//或

for (( expression1; expression2; expression3 ))

do

commands

done

for 循环范围 

for num in {10..0..1}

do

echo $num

done

for 循环数组 

arr=( "Welcome" "to" "zhangjiakou" )

for i in "${arr[@]}"

do

echo $i

done

for i in ${arr[@]}

do

echo $i

done

for i in ${arr[*]}

do

echo $i

done

for i in "${arr[*]}"

do

echo $i

done

表达式 for 循环 

for ((i=1; i<=10; i++))

do

echo "$i"

done

while 循环 

while [ expression ];

do

commands;

multiple commands;

done 

i=1

while(($i<=5))

do
echo $i
let "i++"
done

break 与 continue 

  • break 语句可以终止 for 循环的重复性任务
  • continue 语句在 for 循环中以特定条件跳过该条件下给定的特定语句

函数 

function_name() { commands }

变量的作用域 

  • 默认情况下所有变量都定义为全局变量,即使在函数内部声明也是如此。
  • local关键字在函数内部声明局部变量,该变量只能够在该函数内部使用。

返回值

  • Bash 函数中,其返回值是执行的最后一个语句的状态。1-255(十进制)范围内表示失败,除此之外表示成功。
  • 想要从函数中返回任意实际的值,最简单的选择是将函数的执行结果分配给一个全局变量
  • 更好的选择是将值发送到 stdout 再打印输出

 参数传递

  • $0 为函数本身
  • $1、2 ·  · ·n 参数传递的顺序位
  • $#保存传递给函数的函数的位置参数或数量
  • $$当前进程ID号
  • $*或 $@保存传递给参数的所有位置参数或参数
  • $?显示最后一个命令的退出状态,0表示正常,其他表示错误退出

2.bash脚本编写

read命令

  • read命令是用于从终端或者文件中读取输入的内部命令。 
  • 读取整行输入
  • 每行末尾的换行符不被读入

read命令使用

  • 从标准输入读取输入并赋值给变量
    • read var
  • 从标准输入读取多个内容
    • read var1 var2 var3
  • 不指定变量(默认赋值给REPLY)
    • read 

脚本参数传递

  • $0脚本名称
  • $1~$n获取参数
  • $#传递到脚本的参数个数。$$脚本运行的当前进程ID号
  • $*以一个单字符串显示所有向脚本传递的参数
  • $?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 

 

算术运算

  • a=10 b=20
  • +        加法`expr $a +$b`结果为30
  • -         减法‘expr $a - $b`结果为-10
  • *         乘法`expr $a \* $b`结果为200
  • /          除法‘expr $b / $a`结果为2 
  • %        取余‘expr $a % $b`结果为10
  • =         赋值 a=$b 将把变量b的值赋给a
  • ==       相等相同则返回true: [ $a == $b ] 返回 false
  • !=        不相等不相同则返回true:[ $a !=$b ]返回true
  • -eq      检测相等[ $a -eq $b ]返回false
  • -ne      检测不相等[ $a -ne $b ]返回true
  • -gt       检测左边是否大于右边「$a -gt $b ]返回false
  • -lt        检测左边是否小于右边[ $a -lt $b ]返回true
  • -ge      检测左边是否大于等于右边[$a -ge $b ]返回false
  • -le       检测左边是否小于等于右边[ $a-le $b ]返回true

 

创建目录并生成文件

  • mkdir test
  • cd test
  • echo "hello" > test.txt
  • ls 

 

Bash编程:

  1. 使用 bash 实现自动创建目录并生成文件。
  2. 使用 bash 判断目录是否存在。

 

 

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

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

相关文章

iOS - 解压ipa包中的Assert.car文件

项目在 Archive 打包后&#xff0c;生成ipa包 将 xxx.ipa文件修改为zip后缀即 xxx.zip &#xff0c;然后再双击解压&#xff0c;会生成一个 Payload 文件夹&#xff0c;里面一个文件 如下图&#xff1a; 然后显示改文件的包内容&#xff1a; 解压 Assets.car 文件的方式&…

Linux操作系统1-命令篇

不同领域的主流操作系统 桌面操作系统 Windos Mac os Linux服务器操作系统 Unix Linux(免费、稳定、占有率高) Windows Server移动设备操作系统 Android(基于Linux,开源) ios嵌入式操作系统 Linux(机顶盒、路由器、交换机) Linux 特点&#xff1a;免费、开源、多用户、多任务…

flutter:BottomNavigationBar和TabBar

区别 BottomNavigationBarr和TabBar都是用于创建导航栏的组件&#xff0c;但它们有一些区别。 位置不同&#xff1a;BottomNavigationBar通常位于屏幕底部&#xff0c;用于主要导航&#xff1b;而TabBar通常位于屏幕顶部或底部&#xff0c;用于切换不同的视图或页面。 样式不…

java设计模式-观察者模式

什么是观察者模式 观察者模式&#xff08;Observer&#xff09;是软件设计中的一种行为模式。 它定义了对象之间的一对多关系&#xff0c;其中如果一个对象改变了状态&#xff0c;所有依赖它的对象都会自动被通知并更新。 这种模式包含了两种主要的角色&#xff0c;即被观察…

AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 众所周知&#xff0c;StableDiffusion 是非常强大的AI绘图工具&#xff0c;需要详细了解StableDiffusion的朋友&#xff0c;可查看我之前的这篇文章&#xff1a; …

springboot框架下,请使用@ConfigurationProperties替代@Value加载配置

一、背景 程序启动时&#xff0c;详细报错见下&#xff1a; 10:40:31.965 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘redisDi…

Tribon二次开发- tbbatchjob

在Tribon安装目录下C:\Tribon\M3\Bin里面有许多未知用途的exe,有的双击后时一个DOS终端,有的一闪而过,有的需要按照提示输入信息,有的需要提前在指定的目录配置文件,该如何使用呢? 这些exe大多可以在Tribon以外通过.NET来使用,有的可以通过添加.NET项目引用来使用,有的…

Spring Cloud Alibaba - Nacos源码分析(三)

目录 一、Nacos客户端服务订阅的事件机制 1、监听事件的注册 2、ServiceInfo处理 serviceInfoHolder.processServiceInfo 一、Nacos客户端服务订阅的事件机制 Nacos客户端订阅的核心流程&#xff1a;Nacos客户端通过一个定时任务&#xff0c;每6秒从注册中心获取实例列表&…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

Flink CEP(二) 运行源码解析

通过DemoApp学习一下&#xff0c;CEP的源码执行逻辑。为下一篇实现CEP动态Pattern奠定理论基础。 1. Pattern的定义 Pattern<Tuple3<String, Long, String>,?> pattern Pattern.<Tuple3<String, Long, String>>begin("begin").where(new…

数据分析-关于指标和指标体系

一、电商指标体系 二、指标体系的作用 三、统计学中基本的分析手段

移远通信推出新一代高算力智能模组SG885G-WF,为工业和消费级IoT应用带来全新性能标杆

2023年7月24日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出其新一代旗舰级安卓智能模组SG885G-WF。该智能模组具有高达48 TOPS 的AI综合算力、强大性能及丰富的多媒体功能&#xff0c;非常适用于需要高处理能力和多媒体功能的工业和消费者…

如何在win10环境下配置强化学习gym库(使用vscode)

我是通过anacondavscode完成的gym库的使用&#xff0c;只是把案例跑起来了&#xff0c;具体步骤如下&#xff1a; 1、安装anaconda,参考链接&#xff1a;https://www.jianshu.com/p/2f3be7781451 我其实就是生安装的&#xff0c;也没有去配置环境啥的&#xff0c;就是下载安…

FANUC机器人SRVO-217故障报警原因分析及参考解决办法

FANUC机器人SRVO-217故障报警原因分析及参考解决办法 如下图所示,示教器提示:SRVO-217紧急停止电路板未找到, 查阅手册可以看到以下的报警说明: 故障原因: 通电时未能识别紧急停止电路板或者增设的安全I/O装置。连接有多个安全I/O装置的系统中,在报警信息的最后,会显示发…

进程_PCB 的理解

目录 一. PCB 的概念 1. 为什么需要PCB 2. PCB的属性 二. task struct 1. task struct 介绍 2. 查看进程指令 3. PID 4. PPID 父进程是什么&#xff1f; 为什么要有父进程&#xff1f; 5. fork 创建子进程 1) fork 后的现象 为什么会打印两次&#xff1f; 2) 的返…

自动驾驶感知系统--惯性导航定位系统

惯性导航定位 惯性是所有质量体本身的基本属性&#xff0c;所以建立在牛顿定律基础上的惯性导航系统&#xff08;Inertial Navigation System,INS&#xff09;(简称惯导系统)不与外界发生任何光电联系&#xff0c;仅靠系统本身就能对车辆进行连续的三维定位和三维定向。卫星导…

Linux学成之路(基础篇0(二十三)MySQL服务(主从MySQL服务和读写分离——补充)

目录 一、MySQL Replication概述 优点 异步复制&#xff08;Asynchronous repication&#xff09; 全同步复制&#xff08;Fully synchronous replication&#xff09; 半同步复制&#xff08;Semisynchronous replication&#xff09; 三、MySQL支持的复制 四、部署主从…

手写vuex

vuex 基本用法 vuex是作为插件使用&#xff0c;Vue.use(vuex) 最后注册给new Vue的是一个new Vuex.Store实例 // store.js import Vue from vue import Vuex from vuexVue.use(Vuex) // Vue.use注册插件 // new Vuex.Store实例 export default new Vuex.Store({state: {},gette…

【树链剖分+MST】CF609E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 先把全局的MST求出来&#xff0c;然后对于一条边&#xff0c;如果它本来就在MST中&#xff0c;说明代价就是MST的权值和&#xff0c;否则它加入MST中&#xff0c;此时MST形成了环&#xff0c;我们把环中最大的那…

docker安装rabbitmq

1&#xff0c;拉取rabbitmq容器 docker pull rabbitmq 2&#xff0c;下载完以后启动容器 先查看自己的容器id&#xff1a; [rootch ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE rabbitmq latest bcef1e…