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

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、结构性语句 

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

 主要包括:

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

相关文章:

  • MoCo v3(ICCV 2021)
  • 2024年阿里巴巴全球数学竞赛首次向人工智能(AI)开放
  • 软件设计不是CRUD(22):在流式数据处理系统中进行业务抽象落地——设计思考
  • Shell中执行.sh文件的常见方式
  • 微服务中的相关概念
  • Qt QListView自定义树状导航控件
  • 【学习】程序员资源网址
  • ASP.NET MVC-简单例子
  • 使用QT绘制简单的动态数据折线图
  • Laravel 中 使用模型作为标志
  • 多路h265监控录放开发-(1)建立head窗口并实现鼠标拖动整个窗口
  • 聊聊系统架构之负载均衡优化实践
  • 【调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法】
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • 如何学习C语言
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • go语言学习初探(一)
  • js算法-归并排序(merge_sort)
  • Nodejs和JavaWeb协助开发
  • Spring Cloud Feign的两种使用姿势
  • tweak 支持第三方库
  • vue中实现单选
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 安卓应用性能调试和优化经验分享
  • 测试开发系类之接口自动化测试
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 入口文件开始,分析Vue源码实现
  • 网页视频流m3u8/ts视频下载
  • 线性表及其算法(java实现)
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在weex里面使用chart图表
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​zookeeper集群配置与启动
  • ###C语言程序设计-----C语言学习(6)#
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (arch)linux 转换文件编码格式
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)丶RabbitMQ的六大核心
  • (二十四)Flask之flask-session组件
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .gitignore文件忽略的内容不生效问题解决
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 服务 ServiceController
  • .net2005怎么读string形的xml,不是xml文件。