3.6 Linux shell脚本编程(概念、变量、语句)

news2025/1/17 21:35:53

目录

shell脚本概述

shell脚本编写步骤

第一个shell脚本文件

shell脚本变量

变量的介绍

变量的作用

变量的命名要求

变量的分类

用户自定义变量

取值

用户自定义变量-数组

只读变量

位置变量与预定义变量

环境变量

shell语句

shell程序

说明性语句(注释行)

功能性语句(命令)

结构性语句


shell脚本概述

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

 后缀是.sh

shell脚本编写步骤

需求分析

命令测试

脚本编写

测试调优

第一个shell脚本文件

三种执行方式        

bash test.sh        

source  test.sh        

./test.sh     //这种方式报错大概率是因为权限不够,chmod 0777 test.sh 给文件最高权限

shell脚本不用编译,是一个解释性的语言

shell脚本变量

变量的介绍

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。  

变量可以通过变量名访问。在指令式语言中,变量通常是可变的

变量的作用

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

变量名:使用固定的名称,由系统预设或用户定义  

变量值:能够根据用户设置、系统环境的变化而变化

变量的命名要求

变量的分类

用户自定义变量

在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

等号前后不能加空格

打印 echo

释放 unset

取值

双引号: 允许通过$符号引用其他变量值 弱引用,其中的变量引用会被替换为变量值

单引号: 禁止引用其他变量值,$视为普通字符 强引用,其中的变量引用不会被替换为变量值,而保持源字符串

反撇号: 命令替换,提取命令执行后的输出结果,``和$(…)作用相同

#!/bin/bash 
#变量

COUNT=3
echo $COUNT 
#''和""
echo '$COUNT'
echo "$COUNT"
A=echo COUNT
#这种情况无法赋值
A='echo $COUNT'
A=$(echo $COUNT)
#这两种方式等价都可以
unset COUNT
echo $COUNT

用户自定义变量-数组

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这个数组

#!/bin/bash 
a=(1 2 3 4 5 6 7 8 9)
echo $a
#默认打印第一个数组
echo ${a[*]}
echo ${a[@]}
#打印整个数组,两种方式效果相同
echo ${#a[*]}
#取数组元素的个数
echo ${a[2]}
#取数组中某一个元素
a[2]=9
echo ${a[2]}
#数组单个赋值
unset a[2]
echo ${a[*]}
#删除数组中某个元素
echo ${a[@]:1:3}
#从下标1打印三个元素
unset a
#删除整个数组

只读变量

 变量值不允许修改(重新赋值)的情况  

无法使用 unset删除  最快方法重启  

在变量名前写readonly

位置变量与预定义变量

$0    与键入的命令行一样,包含脚本文件名

$1,$2,……$9 ${10} 分别包含第一个到第十个命令行参数

$#     包含命令行参数的个数

$@   包含所有命令行参数:“$1,$2,……$9”

$*     包含所有命令行参数,是一个整体:“$1,$2,……$9”

$?     包含前一个命令的退出状态

$$     包含正在执行进程的ID号

环境变量

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径  

export可以将变量指定为全局变量

shell语句

shell程序

Shell 程序由零或多条shell语句构成。 shell语句包括三类:  说明性语句  功能性语句  结构性语句。

说明性语句(注释行)

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

#! /bin/sh

#

# 本程序说明

#

command_1

command_2                  # command_2的语句说明

……

# 下面程序段的说明

command_m

……

command_n                  # command_n语句的说明

……

功能性语句(命令)

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

       read  var

     把读入的数据全部赋给var

       read  var1  var2  var3

     把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.

-t 几秒自动结束语句

-f 输入提示语句

-s 输入不回显   

如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:

$ expr  12  +  5  \*  3

27

$ expr  3  -  8  /  2  

-1

$ num=9

$ sum=`expr  $num  \*  6 `

$ echo  $sum

54

test语句可测试三种对象:

          字符串     整数     文件属性

每种测试对象都有若干测试操作符

字符串测试

s1 = s2       测试两个字符串的内容是否完全一样

s1 != s2    测试两个字符串的内容是否有差异

-z s1                  测试s1 字符串的长度是否为0

-n s1                  测试s1 字符串的长度是否不为0

整数测试

a -eq b     测试a 与b 是否相等

a -ne b        测试a 与b 是否不相等

a -gt b         测试a 是否大于b

a -geb         测试a 是否大于等于b

a -lt b         测试a 是否小于b a -le

b         测试a 是否小于等于b

 文件测试

-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 更旧

结构性语句

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

主要包括:

条件测试语句(两路分支)

多路分支语句

循环语句

循环控制语句等

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

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

相关文章

MATLAB连续时间信号的实现和时域基本运算(八)

1、实验目的: 1)熟悉常用连续时间信号的实现方法; 2)掌握连续时间信号的时域基本运算; 3)掌握实现基本函数及其运算的函数的使用方法; 4)加深对信号基本运算的理解。 2、实验内容&am…

【VM服务管家】VM4.0平台SDK_2.4 结果获取类

目录 2.4.1 数据结果:通过流程输出或模块输出获取数据结果的方法2.4.2 流程运行:所有流程运行结束的回调方法2.4.3 模块回调:所有模块运行结束的回调方法2.4.4 加密狗回调:获取加密狗状态的回调方法2.4.5 方案加载:方案…

STM32物联网实战开发(4)——基本定时器

我使用的是正点原子的阿波罗F429开发板,他有14个定时器,本次实验使用STM32F429的基本定时器6作定时,在中断中每隔1秒翻转LED电平状态。 1.CubeMX初始化定时器 先开启定时器6 再对定时器6的参数进行配置,将定时器6定时时间配置为…

记一次SSRF漏洞的学习和利用

导语:本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。 1.前言 本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。此漏洞并结合腾讯云的API接口,可以获取大量嘶吼服务器的敏感信息。利用这些敏感信息,又…

阿里测试8年,肝到P8只剩他了····

在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成了一份完整的笔记…

玩转ChatGPT提示词 持续更新·······

导语: 众所周知,在AI的世界里,提示词就是和AI沟通语言的桥梁,提示关键词常用于AI对话及AI绘画等相关场景,通过准确的使用关键词,你就能更好的让AI辅助自己的工作,其中的成分重要性不言而喻&…

黑客教程,从零基础入门到精通

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

c++标准模板(STL)(std::array)(三)

定义于头文件 <array> template< class T, std::size_t N > struct array;(C11 起 std::array 是封装固定大小数组的容器。 此容器是一个聚合类型&#xff0c;其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组…

C#非常实用的技巧

1、解压和压缩 .NET Framework 4.5以上版本&#xff1a; string zipFilePath "C:\path\to\file.zip";string destFolder "C:\path\to\destination\folder";using (var archive ZipFile.OpenRead(zipFilePath)){foreach (var entry in archive.Entries…

【Python】【进阶篇】14、Django创建第一个项目

目录 Django创建第一个项目1. 第一个项目BookStore1) BookStore项目创建 2. Django项目配置文件1) manage.py文件2) __init__.py文件3) settings.py文件4) urls.py文件5) wsgi.py文件 Django创建第一个项目 在上一章中&#xff0c;我们完成了开发环境的搭建工作。 本章我们将学…

网络安全基础入门学习路线

在大多数的思维里总觉得学习网络安全得先收集资料、学习编程、学习计算机基础&#xff0c;这样不是不可以&#xff0c;但是这样学效率太低了&#xff01; 你要知道网络安全是一门技术&#xff0c;任何技术的学习一定是以实践为主的。也就是说很多的理论知识其实是可以在实践中…

【一起撸个DL框架】4 反向传播求梯度

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 4 反向传播求梯度&#x1f965;4.1 简介4.2 导数与梯度4.3 链式法则4.4 示例&#xff1a;y2x1的梯度 4 反向传播求梯度&#x1f965; 4.1 简介 上一篇&#xff1a;【一起撸个DL框架】…

Python标准数据类型-String(字符串)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1 &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山…

MATLAB符号运算(七)

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握定义符号对象和创建符号表达式的方法&#xff1b; 2&#xff09;掌握符号运算基本命令和规则&#xff1b; 3&#xff09;掌握符号表达式的运算法则以及符号矩阵运算&#xf…

大型Saas系统的权限体系设计(二)

X0 上期回顾 上文《大型Saas系统的权限体系设计(一)》提到2B的Saas系统的多层次权限体系设计的难题&#xff0c;即平台、平台的客户、客户的客户&#xff0c;乃至客户的客户的客户如何授权&#xff0c;这个可以通过“权限-角色-岗位”三级结构来实现。 但这个只是功能权限&am…

mac免费杀毒软件哪个好用?如何清理mac系统需要垃圾

CleanMyMac x是一款功能强大的Mac系统优化清理工具&#xff0c;使用旨在帮助用户更加方便的清理您系统中的所有垃圾&#xff0c;从而加快电脑运行速度&#xff0c;保持最佳性能&#xff0c;更加稳定、流畅、快速&#xff01;&#xff01;&#xff01; CleanMyMac X无疑是目前m…

C++内存管理基础

文章目录 前言1. C/C内存分布2. C语言中动态内存管理方式3. C中动态内存管理3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数&#xff08;重点&#xff09; 5. new和delete的实现原理5.1…

hana odata batch

sap 博客有写 odata batch 处理前&#xff0c;先看一张图 In this blog post,we are going to see how to send a Odata Batch Request to the SAP Cloud for Customer system using POSTMAN Tool. Answers to expect from this post? How to use batch request in the POS…

『python爬虫』04. 爬虫需要知道的HTTP协议知识(保姆级图文)

目录 1. HTTP协议是什么&#xff1f;2. HTTP协议结构3. 爬⾍需要的请求头和响应头内容总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. HTTP协议是什么&#xff1f; HTTP协议, Hyper Text Transfer Protocol…

2023独立站能不能做FP?看完这篇你就懂了

现在已经快2023年中了&#xff0c;2023年已经过去了1/3&#xff0c;但还是有人在问特货产品能不能做独立站&#xff0c;还是有不少人在观望。心动不如行动啊朋友们&#xff01;要是想在跨境独立站做出一番事业来&#xff0c;建议现在立马行动起来&#xff0c;趁早在FP独立站领域…