lv3 嵌入式开发-6 linux shell脚本编程(概念、变量、语句)

1 Shell脚本概述

1.1Shell脚本概述

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

1.2Shell脚本编写流程

 第一个Shell脚本文件

#!/bin/bashecho "hello world"
执行方式bash test.shsource  test.sh./test.sh

2 Shell脚本变量

2.1变量介绍

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

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

2.2变量的作用

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

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

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

2.3变量的命名要求

2.4变量的分类

2.4.1 用户自定义变量

变量可以再终端中使用,也可以代码中使用

在shell编程中通常使用全大写变量,方便识别
$ COUNT=1
变量的调用:在变量前加$ 
$ echo $COUNTLinux Shell/bash从右向左赋值
$Y=y
$ X=$Y
$ echo $X 
y 使用unset命令删除变量的赋值 
$ Z=hello 
$ echo $Z 
hello 
$ unset Z 
$ echo $Z 

取值 

双引号: 允许通过$符号引用其他变量值(不加引号也一样echo $COUNT echo "$COUNT")

        弱引用,其中的变量引用会被替换为变量值

单引号: 禁止引用其他变量值,$视为普通字符

        强引用,其中的变量引用不会被替换为变量值,而保持源字符串

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

数组

#array数组
a=(1 2 3 4 5)
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这个数组

2.4.2 只读变量

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

无法使用 unset删除

最快方法重启

readonly

readonly COUNT=3

2.4.3 位置变量和预定义变量


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

 示例:

#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $#
执行
./test.sh 1 2 3 4 5
输出
./test.sh
1
2
3
5   //一共传入了5个

 

2.4.4 环境变量

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

示例

3 Shell语句

3.1 Shell程序

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

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

3.2 说明性语句

说明性语句(注释行)

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

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

3.3 功能性语句

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

read  var  //  把读入的数据全部赋给var

示例: 

把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量. 如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。  -t 跟随等待事件 -p 跟随终端的提示信息 -s输入不回显

示例:

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:$ expr  12  +  5  \*  327$ expr  3  -  8  /  2-1$ num=9$ sum=`expr  $num  \*  6 `$ echo  $sum54

示例

 这里+前后需要空格

test语句可测试三种对象:           字符串     整数     文件属性

条件成立输出0  条件不成立输出1

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

字符串测试
s1 = s2   	测试两个字符串的内容是否完全一样
s1 != s2	测试两个字符串的内容是否有差异
-z s1 	             测试s1 字符串的长度是否为0
-n s1 	             测试s1 字符串的长度是否不为0

示例:

 注意 加上双引号减少错误,否则会显示0

整数测试 
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

示例:

文件测试
-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 更旧

示例:

3.4 结构性语句

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

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

多路分支语句

循环语句

循环控制语句等

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

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

相关文章

权限提升-Linux提权-环境变量文件配合SUID提权

LINUX系统提权项目介绍 一个综合类探针: Linux:https://github.com/liamg/traitor 一个自动化提权: Linux:https://github.com/AlessandroZ/BeRoot 两个信息收集: Linux:https://github.com/rebootuser/Lin…

Java设计模式:四、行为型模式-08:策略模式

文章目录 一、定义:策略模式二、模拟场景:策略模式三、违背方案:策略模式3.0 引入依赖3.1 工程结构3.2 优惠券折扣计算类3.3 单元测试 四、改善代码:策略模式4.1 工程结构4.2 策略模式结构图4.3 优惠券折扣实现4.3.1 定义优惠券接…

【LeetCode】剑指 Offer <二刷>(7)

目录 题目:剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 14- II. 剪绳子 II - 力扣(…

selenium中定位shadow-root,以及获取shadow-root内部的数据

通过shadow-root的父级定位到shadow-root,再通过语句进行操作 两种方法: 第一种,Python种JS实现 第二种,selenium实现 1.0 案例网站 参考某橘色网站 2.0 js语句定位 可在控制台进行测试 测试语句 document.querySelector("ali-ba…

uni-app点击复制指定内容(点击复制)

官方api uni.setClipboardData(OBJECT) uni.setClipboardData({data: 要被复制的内容,success: function () {console.log(success);} });

文件上传漏洞全面渗透姿势

0x00 文件上传场景 (本文档只做技术交流) 文件上传的场景真的随处可见,不加防范小心,容易造成漏洞,造成信息泄露,甚至更为严重的灾难。 比如某博客网站评论编辑模块,右上角就有支持上传图片的功能,提交带…

.net core 上传文件大小限制

微软官网文档中给的解释是.net core 默认上传文件大小限制是30M&#xff0c;所以即便你项目里没有限制&#xff0c;这里也有个默认限制。 官网链接地址 总结了一下解决办法&#xff1a; 1.首先项目里添加一个web.config自定义配置文件 在配置文件中加上这段配置 <!--//…

微服务-kubernetes安装

文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性&#xff1a;2.2.2、传统部署方式&#xff1a;2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…

Linux的服务器日志分析及性能调优

作为网络安全和数据传输的重要环节&#xff0c;代理服务器在现代互联网中扮演着至关重要的角色。然而&#xff0c;在高负载情况下&#xff0c;代理服务器可能面临性能瓶颈和效率问题。本文将介绍如何利用Linux系统对代理服务器进行日志分析&#xff0c;并提供一些实用技巧来优化…

CSS中如何隐藏元素但保留其占位空间(display:nonevsvisibility:hidden)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 隐藏元素但保留占位空间⭐ display: none;⭐ visibility: hidden;⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

算法笔记 二叉搜索树

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种数据结构&#xff0c;用于存储具有可比较键&#xff08;通常是数字或字符串&#xff09;的元素 1 结构特点 节点结构&#xff1a;每个节点都有一个键和两个子节点&#xff08;左子节点和右子…

HTML5-4-表单

文章目录 表单属性表单标签输入元素文本域&#xff08;Text Fields&#xff09;密码字段单选按钮&#xff08;Radio Buttons&#xff09;复选框&#xff08;Checkboxes&#xff09;按钮&#xff08;button&#xff09;提交按钮(Submit)label标签 文本框&#xff08;textarea&am…