shell脚本编程(概念、编程和语句)

一、shell脚本概述 

1、shell脚本概念 

        Shell 脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。

 

2、Shell 脚本编写步骤 

 

第一个 Shell 脚本文件:

  • 执行方式
  • bash test.sh
  • source test.sh
  • ./test.sh 

  二、shell脚本变量 

1、变量介绍

  • 变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
  • 变量可以通过变量名访问。在指令式语言中,变量通常是可变的

2、 变量的作用

用来存放系统和用户需要使用的特定参数(值):

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

3、变量的命名要求 

4、变量的分类

5、用户自定义变量

在 shell 编程中通常使用全大写变量,方便识别

  • $ COUNT=1

变量的调用:在变量前加 $

  • $ echo $COUNT

Linux Shell/bash 从右向左赋值

  • $Y=y
  • $ X=$Y
  • $ echo $X
  • y

使用 unset 命令删除变量的赋值

  • $ Z=hello
  • $ echo $Z
  • hello
  • $ unset Z
  • $ echo $Z

6、 用户自定义变量

        1)用户自定义变量 - 取值
  • 双引号 : 允许通过 $ 符号引用其他变量值
  • 弱引用,其中的变量引用会被替换为变量值
  • 单引号 : 禁止引用其他变量值, $ 视为普通字符
  • 强引用,其中的变量引用不会被替换为变量值,而保持源字符串
  • 反撇号 : 命令替换,提取命令执行后的输出结果, `` 和 $(...) 作用相同
         2)用户自定义变量 - 数组
  • echo $a :默认显示数组 a 的第一个元素
  • echo ${a[0]} :显示数组中第一个元素,以此类推
  • echo ${a[-1]} : 显示数组中最后一个元素
  • echo ${a[*]} 和 echo ${a[@]} :显示数组中所有元素
  • echo ${#a[@]} :显示数组中元素的个数
  • echo ${a[@]: 起始元素 id: 元素个数 ]} :显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素 id 不能为负值
  • unset a[n] 删除数组中的第 n 个元素
  • unset a 删除 a 这个数组 

 7、只读变量

  • 变量值不允许修改(重新赋值)的情况
  • 无法使用 unset 删除
  • 最快方法重启
  • readonly

8、位置变量和预定义变量

  • $0 与键入的命令行一样,包含脚本文件名
  • $1,$2,......$9 ${10} 分别包含第一个到第十个命令行参数
  • $# 包含命令行参数的个数
  • $@ 包含所有命令行参数:“ $1,$2,......$9”
  • $* 包含所有命令行参数,是一个整体:“ $1,$2,......$9”
  • $? 包含前一个命令的退出状态
  • $$ 包含正在执行进程的 ID 号

9、环境变量

常用环境变量

  • $USER 表示用户名称
  • $HOME 表示用户的宿主目录
  • $LANG 表示语言和字符集
  • $PWD 表示当前所在工作目录
  • $PATH 表示可执行用户程序的默认路径
  • export 可以将变量指定为全局变量 

三、shell语句 

1、shell程序 

Shell 程序由零或多条 shell 语句构成。 shell 语句包括三类 :

  • 说明性语句
  • 功能性语句
  • 结构性语句

 2、说明性语句(注释行)

以 # 号开始到该行结束,不被解释执行

        注释行可以出现在程序中的任何位置 , 既可以单独占用一行 , 也可以接在执行语句的后面 . 以 # 号开始到所在行的行尾部分,都不被解释执行 .

例如 : 

#! /bin/sh
#
# 本程序说明
#
command_1
command_2 # command_2 的语句说明
......
# 下面程序段的说明
command_m
......
command_n # command_n 语句的说明
......

3、功能性语句(命令)

1)命令 -read 

read 从标准输入读入一行 , 并赋值给后面的变量 , 其语法为 :

read var

把读入的数据全部赋给 var

read var1 var2 var3
  • 把读入行中的第一个单词 (word) 赋给 var1, 第二个单词赋给 var2 , ......把其余所有的词赋给最后一个变量 .
  • 如果执行 read 语句时标准输入无数据 , 则程序在此停留等侯 , 直到数据的到来或被终止运行。
2)算术运算命令 -expr

        算术运算命令 expr 主要用于进行简单的整数运算,包括加 (+) 、减( - )、乘( \*) 、整除

( / )和求模( % )等操作。例如 : 

$ expr 12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1
$ num=9
$ sum=`expr $num \* 6 `
$ echo $sum
54
3)命令 -test
  • test 语句可测试三种对象 :
  • 字符串 整数 文件属性
  • 每种测试对象都有若干测试操作符 
4)字符串测试
  • s1 = s2 测试两个字符串的内容是否完全一样
  • s1 != s2 测试两个字符串的内容是否有差异
  • -z s1 测试 s1 字符串的长度是否为 0
  • -n s1 测试 s1 字符串的长度是否不为 0
5)整数测试
  • a -eq b 测试 a 与 b 是否相等
  • a -ne b 测试 a 与 b 是否不相等
  • a -gt b 测试 a 是否大于 b
  • a -ge b 测试 a 是否大于等于 b
  • a -lt b 测试 a 是否小于 b
  • a -le b 测试 a 是否小于等于 b 
6)文件测试
  • -e name 测试一个文件是否存在
  • -d name 测试 name 是否为一个目录
  • -f name 测试 name 是否为普通文件
  • -L name 测试 name 是否为符号链接
  • -r name 测试 name 文件是否存在且为可读
  • -w name 测试 name 文件是否存在且为可写
  • -x name 测试 name 文件是否存在且为可执行
  • -s name 测试 name 文件是否存在且其长度不为 0
  • f1 -nt f2 测试文件 f1 是否比文件 f2 更新
  • f1 -ot f2 测试文件 f1 是否比文件 f2 更旧 

4、结构性语句 

        结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。

 主要包括:

  • 条件测试语句(两路分支)
  • 多路分支语句
  • 循环语句
  • 循环控制语句等 

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

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

相关文章

【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)

文章目录 前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列(一)题目描述题目解析总结 前言 一、BM70 兑换零钱(一) 题目描述 描述: 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币…

STM32 proteus + STM32Cubemx仿真教程(第五课ADC光敏电阻采样教程)

文章目录 前言一、ADC概念二、光敏电阻的概念1. 光敏电阻的工作原理2. 光敏电阻的特性3. 光敏电阻的应用4. 光敏电阻的电路设计5. 实际使用中的注意事项总结 三、STM32Cubemx创建工程四、proteus仿真电路图五、代码编写1. HAL_ADC_Start 函数原型参数返回值功能描述示例 2. HAL…

【ARM Cache 及 MMU 系列文章 1.3 -- 如何判断 L2 Cache 是否实现?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 CPU Configuration Register代码实现CPU Configuration Register 在 Armv9 架构中,我们可以通过arm 提供的自定义寄存器IMP_CPUCFR_EL1 来判断当前系统中是否实现了 L2 Cache, 如下所…

Chromium 开发指南2024 Mac篇-Xcode安装(二)

1.引言 在开始编译和开发 Chromium 之前,确保开发环境的正确配置是至关重要的。对于 Mac 用户来说,Xcode 是不可或缺的工具,因为它不仅提供了必需的编译器和工具链,还包含了与 macOS 系统深度整合的开发资源。在本系列指南的第一…

LeetCode | 2879.显示前三行

在 pandas 中,可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行,可以在 head() 方法中传入一个参数 n,读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…

嵌入式中间件_3.嵌入式中间件的一般架构

根据嵌入式中间件的不同类型和其应用对象的不同,其架构也有所不同,通常嵌入式中间件没有统一的架构,这里仅仅列举两种中间件架构。 1.消息中间件 1.1消息中间件原理架构 消息中间件是消息传输过程中保存消息的一种容器。它将消息从它的源中…

uniapp 自定义页面顶部导航栏

效果图 1.移除原生导航栏 {"path": "pages/common/homePage/homePage","style": {"navigationBarTitleText": "","navigationStyle": "custom"} } 2.获取不同手机顶部自带 电量高度、信号、时间导航栏…

玩了两年黑苹果+两年MBP,macOS究竟好在哪?

注:本文仅为个人观点,仅供参考。 前言 今天比较无聊,小白突然盘点了一下自己使用macOS系统的点点滴滴,这也算是一个闲聊帖子吧。 首先,本帖子无任何广告行为,纯属唠嗑文。 声明一下,以防有小…

如何优雅地限制textarea的输入字数?

大家好&#xff0c;我是瑶山&#xff0c;今天聊聊textarea textarea 有基础的同学都知道<textarea>是HTML中的一个标签&#xff0c;用于定义多行的文本输入控件。它允许用户在表单中输入多行文本&#xff0c;相较于单行输入框可以输入更多的内容。 但是&#xff0c;如果…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后&#xff0c;网络层负责添加IP段&#xff0c;包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…

使用Minikube部署Kubernetes环境

使用Minikube部署Kubernetes环境 1. Minikube简介 Minikube是一个轻量级的Kubernetes实现&#xff0c;它在本地运行一个Kubernetes集群&#xff0c;可以是单节点或者集群环境&#xff0c;主要用于开发和测试。Minikube支持Kubernetes的所有主要功能&#xff0c;包括Dashboard…

淘宝镜像地址失效

1. 使用nvm安装node时候报错 报错内容 Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate has expired or is not yet valid:报错原因 淘宝镜像地址的证书过期了 解决 找到nvm安装的根目…

scratch3编程02-使用克隆来编写小游戏

目录 1&#xff0c;游戏效果 2&#xff0c;游戏代码块 1&#xff09;玩家 2&#xff09;障碍物 ​ 3&#xff09;箭头 ​ 4&#xff09;关卡图片 3&#xff0c;scratch文件 1&#xff0c;游戏效果 使用克隆 在这个游戏中&#xff1a; 程序开始&#xff1a;只要点击“…

统计学一(术语,正态)

目录 一&#xff0c;常用术语 二&#xff0c;正态分布&#xff08;Normal Distribution&#xff09; 三&#xff0c;中心极限定理(Central Limit Theorem) 一&#xff0c;常用术语 population(族群)&#xff1a;要统计的总的 populationSize(族群数量)&#xff1a;要统计的总…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题&#xff0c;有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集&#xff0c;本章节将介绍如何在Ardupilot上进行获…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

zerotier自建moon方法

简介 使用zerotier已经有一段时间了&#xff0c;现在偶尔会出现服务器连接不上的情况。我就想自己建个moon来试试。记录一下过程&#xff0c;用作备忘录。 准备工作 准备一个有公网IP的云主机。我用的是“三丰云”&#xff0c;速度很快同时提供"免费虚拟主机"和“免费…

商讯杂志商讯杂志社商讯编辑部2024年第10期目录

案例分享 基于胜任素质的干部选拔和梯队建设体系探讨——以A区卫生健康系统为例 康文雁; 1-4 “家庭五险一金”对居民商业保险购买存在挤出效应——基于江苏省徐州、淮安、泰州三市的实证研究 李炳毅; 5-8 人口老龄化背景下促进徐州市经济高质量发展的探究 李艳秋;…

java:spring actuator扩展原有info endpoint的功能

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437506 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

【热门开源项目推荐】满足不同程序员的需求与关注点

目录 前言一、热门开源项目介绍二、使用开源热门项目的优势&#xff08;一&#xff09;经济方面&#xff08;二&#xff09;技术方面&#xff08;三&#xff09;社区支持及协作方面 三、程序员选择项目模型建议&#xff08;一&#xff09;关键步骤&#xff08;二&#xff09;示…