shell 脚本变量

目录

什么是 shell

shell 的两种面向对象

shell 脚本概述

脚本 (本质为程序)

脚本的组成

执行脚本

例题

脚本构成

脚本执行逻辑及执行方式

脚本的常见错误

编写 shell 脚本

执行脚本文件的方式

重定向

重定向操作

shell 变量的作用及类型

变量的作用

变量的类型

变量的使用方式

自定义变量

命名要求

特殊符号

环境变量

示例

只读变量

位置变量

预定义(状态)变量

整数的运算环境

expr ,命令

脚本举例

简单的计算器脚本

显示五大性能脚本

磁盘分区的脚本

本地搭建 yum 仓库脚本

脚本补充命令

set -e

set -u

| (管道符)

|xargs

echo $?

read


什么是 shell

—— 是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户;这种对话方式可以是交互的也可以是非交互的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们


shell 的两种面向对象

—— 面向过程语言

  • 开发的时候,需要一步一步执行

  • 做一件事情,排出个步骤

  • 问题规模小,可以步骤化,按部就班处理

  • 以指令为中心,数据服务于指令

  • C 、shell

—— 面向对象语言

  • 开发的时候将任务当成一个整体

  • 一种认识世界、分析世界的方法论,将万事万物抽象为各种对象

  • 将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事情内部的情况,而编程就是设置事物能够完成功能

  • 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合

  • 对象是类的具象,是一个实体

  • 问题规模大,复杂系统

  • 以数据为中心,指令服务于数据

  • java 、python 、golang 等 云 go k8个字母s 平台


shell 脚本概述

—— shell 脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件

  • 给该文件可执行权限

  • 可结合各种 shell 控制语句以完成更复杂的操作

—— shell 脚本应用场景

  • 重复性操作

  • 交互性任务

  • 批量事务处理

  • 服务运行状态监控

  • 定时任务执行


脚本 (本质为程序)

—— 如果以 .sh 为结尾,会显示高亮,否则视为普通文件

脚本的组成
  • 声明解释器

  • 注释信息

  • 执行命令

#!/bin/bash  #声明解释器,代表接下来使用什么解释器来解释接下来的命令
#命令内容

执行脚本
  1. 直接调用 shell 解释器,加上脚本的名字

    —— 格式:bash 脚本名 ;不需要加上权限

  2. 路径/脚本

    —— 路径:绝对路径;需要权限

  3. source (或 .)脚本名

    —— 不建议使用,不需要权限,会修改目前的环境内容,会有一些问题

    —— source 文件名 参数:会直接修改 bash 环境

如果想让脚本全局运行(Tab 键补全),将脚本放入 $PATH 路径下,并且脚本要有执行权限

例题

为什么命令可以补全

—— 运行权限

脚本构成
  • 脚本申明(解释器):第一行开头 “#!/bin/bash” ,表示此行以下的代码语句是通过 /bin/bash 程序来解释执行,#!/bin/bash 为默认的解释器还有其它类型解释器 #!/bin/python #!/bin/pxpect

  • 注释信息:以 # 开头的语句表示为注释信息

  • 可执行语句:比如 echo 命令用于输出 " " 之间的字符串

脚本执行逻辑及执行方式

脚本执行逻辑

  1. 顺序执行:程序按从上到下顺序执行

  2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

  3. 循环执行:程序执行过程中需要重复执行多次某段语句

脚本的常见错误
  • 命令错误:不影响接下来的命令执行,但是本条命令不执行

    —— bash -x 脚本名 :模拟执行后发现错误

  • 语法错误:直接影响脚本无法正常运行

    —— bash -n 脚本名:检查语法错误

  • 逻辑错误

常见错误的区别

  1. 语法错误:会导致后续的命令不继续执行,可以用 bash -n 检查错误,提示的出错行数不一定是准确的

  2. 命令错误:默认后续的命令还会继续执行,用 bash -n 无法检查出来,可以使用 bash -x 进行观察

  3. 逻辑错误:只能使用 bash -x 进行


编写 shell 脚本

执行脚本文件的方式
  1. 脚本文件路径(绝对路径与相对路径;必须要有 x 权限)

  2. 格式:sh 脚本文件路径

  3. 格式:source 脚本文件路径(也可以通过 . 来执行)

重定向

—— 改变电脑数据的输出方向(默认电脑数据的输出方向是屏幕)

解释

—— 发了一条指令给电脑操作,电脑会回复结果一定会显示在屏幕上,称为:标准输出

如果电脑没有正确回复,称为:错误输出

通过键鼠、扫描仪、话筒等设备输入给电脑的指令,称为:标准输入

—— 改变输出方向

  • 输出到别的终端设备

  • 输出到文件中

类型解释
标准输出(STDOUT)默认的设备为显示器,文件编号为 1 ,命令将执行后的输出结果发送到标准输出文件
标准错误(STDERR)默认的设备为显示器,文件编号为 2 ,命令将执行期间的各种错误信息发送到标准错误文件
标准输入(STDIN)默认的设备为键鼠,文件编号为 0 ,命令将从标准输入文件中读取在执行过程中需要的输入数据

重定向操作
类型操作符作用
重定向输入< 或 >从指定的文件读取数据,而不是从键鼠输入
重定向输入>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>将错误信息追加到指定的文件中
混合输出&>将标准输出、标准错误的内容保存到同一个文件中

shell 变量的作用及类型

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

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

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

变量的类型
  • 自定义变量:由用户自己定义、修改和使用

  • 预定义变量:$? 、$$ 、$* 、$@ ,shell 程序中自带的

  • 环境变量 :env 看到所有环境的变量

  • 只读变量 :只可以读不可以改

  • 位置变量 :$1 、$2、……、$n

含义

变量:值可以变化的

常量:值不可以变化

shell 不分数据类型,所有的数类型都是字符串

变量的使用方式
要求方式
设置变量变量名=变量值,两边没有空格
调用变量echo $变量名
删除变量unset 变量名
重新定义变量变量名=变量值
追加变量值变量名+=变量值

自定义变量

—— 默认情况下,新定义的变量只在当前的 shell 环境中有效,因此称为局部变量;当进入子程序或新的子 shell 环境时局部变量将无法再使用

—— 可以通过内部命令 export 将指定的变量导出为全局变量,使用户定义的变量在所有的子 shell环境中能够继续使用

格式:export 变量名

系统内置变量:PATH、UID、HOSTNAME、USER

命名要求
  • 区分大小写

  • 不能使程序中的保留字和内置变量:如: if, for, hostname

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “-",和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 驼峰 :StudentFirstName

  • 小驼峰 :studentFirstName

  • 下划线 :student_name

特殊符号
  • ${} 定义的变量名的范围;用 ${ } 一定不会错

  • " " (英文)变量在双引号中可以识别,弱识别

  • ' ' (英文)变量在单引号中不被识别,强识别

  • ``(英文)反撇号代表引用命令执行的结果,用于命令的替换,效果等于 $( )

环境变量
  • 由系统提前创建,用来设置用户的工作环境

  • 可以使用 env 命令查看环境变量

  • 需要记住的常用环境变量

  • 配置文件:/etc/profile(全局生效);~/.bash_profile(当前用户环境)

选项解释
$USER表示用户名称
$HOME表示用户的宿主目录
$LANG表示语言和字符集
$PWD表示当前所在工作目录
$PATH表示可执行用户程序的默认路径
示例

将文件所在目录添加路径,可以执行脚本

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data
​
chmod +x 脚本名
​
直接输脚本名,可以执行

只读变量

—— 格式:readonly 选项 参数

  • readonly 命令用于定义只读 shell 变量和 shell 函数

  • readonly -p :可以输出显示系统中所有定义的只读变量

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

  • 无法使用 unset 删除

  • 最快方法重启

位置变量

—— 使用 $1 、$2、……等表示

位置参数含义
echo "$1"位置 1
echo "${10}"位置 10;10 以上的参数需要 {}
echo "$*"将所有项当成一个值
echo "$@"所有项
echo "$0"脚本本身
echo "$#"后面参数的个数

预定义(状态)变量
预定义作用
$?代表上一次命令的执行结果是否正确;0 代表正确,反之为错误
$0代表脚本的文件名字
$$当前 bash 的 pid
$#代表位置参数的总个数
$*代表返回所有参数,所有参数当成一个整体返回
$@代表返回所有参数,每一个参数都是一个独立的个体返回
$!后台任务最后一个 id

整数的运算环境

expr ,命令

—— 计算器

—— 格式:expr 变量1 运算符 变量2 [运算符 变量3]

运算符作用
+加法
-减发
\ *乘法
/除法
%取余数
++和--增加和减少,可前置也可以放在结尾
let定义变量并将器初始化为一个值:例;expr let a=1+1—将结果存储在变量 a 中,echo $a —输出结果

脚本举例

简单的计算器脚本

#!/bin/bash
read -p  "数字1:"  num1      #交互过程
read -p  "数字2:"  num2      #交互过程
​
expr  $num1 + $num2          #计算,数字1加数字2

显示五大性能脚本

#!/bin/bash#删除空格   #只显示第三列空格也算一列
ip=`ifconfig ens32|grep netmask|tr -s " "|cut -d " " -f3` 
cpu=`lscpu |grep 型号名称|cut -d":" -f2|tr -s " "`  
mem=`free -h|grep Mem|tr -s " "|cut -d " " -f2`      
disk=`lsblk |grep disk|tr -s " "|cut -d" " -f4`
​
​
echo "-------------------systeminfo---------------------"
echo "ip地址  :    ${ip}"
echo "主机名  :    $(hostname)"
echo "系统版本:    $(cat /etc/redhat-release)"
echo "cpu型号 :   $cpu"
echo "内存大小:    $mem"
echo "磁盘大小:    $disk"
echo "--------------------------------------------------"
​

磁盘分区的脚本

#!/bin/bash
​
read -p "分区的设备:"   disk     #交互过程
read -p "分区的大小:"   num      #交互过程
​
echo -e "n\n\n\n\n${num}\nw\n "|fdisk ${disk}
​

实验过程

本地搭建 yum 仓库脚本

#!/bin/bash
mount /dev/sr0 /mnt
cd /etc/yum.repos.d
mkdir yuan
mv *.repo yuan
​
echo "
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
​
"  > local.repo
​
yum clean all &>/dev/null     #/dev/null 此为 Linux 的垃圾箱
yum makecache &>/dev/null    
​
yum install -y tree  &>/dev/null
#将下载产生的信息导入垃圾箱,就不会显示下载信息
​

脚本补充命令

set -e

—— 在脚本的前面输入该命令,一旦出错立即停止运行

set -u

—— 变量不存在不让执行

| (管道符)

—— 将第一个命令的结果当做后一个命令的处理对象

|xargs

—— 将上一个命令的结果翻译成标准输出结果作为下一个命令的处理对象

echo $?

—— 结果显示为 0 则正确,反之,错误

read

—— 用来提示用户输入信息,实现简单的交互过程

—— read -p :设置提示信息

read -t :输入等待时间(单位默认为秒)

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

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

相关文章

CentOS7安装部署Kafka with KRaft

文章目录 CentOS7安装部署Kafka with KRaft一、前言1.简介2.架构3.环境 二、正文1.部署服务器2.基础环境1&#xff09;主机名2&#xff09;Hosts文件3&#xff09;关闭防火墙4&#xff09;JDK 安装部署 3.单机部署1&#xff09;下载软件包2&#xff09;修改配置文件3&#xff0…

数据结构【栈】

文章目录 数据结构 栈栈的概念与结构栈接口实现 数据结构 栈 栈的概念与结构 栈是是一种特殊的线性表&#xff0c;栈的规定是只在一端插入删除数据&#xff0c;插入删除的一端叫做栈顶&#xff0c;另一端叫栈底。根据上面的特性&#xff0c;栈的数据是后入先出 栈接口实现 栈接…

【算法】二分查找-20231121

这里写目录标题 一、344. 反转字符串二、392. 判断子序列三、581. 最短无序连续子数组四、680. 验证回文串 II 一、344. 反转字符串 提示 简单 865 相关企业 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组…

JMeter-BeanShell预处理程序和BeanShell后置处理程序的应用

一、什么是BeanShell&#xff1f; BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器&#xff0c;JMeter性能测试工具也充分接纳了BeanShell解释器&#xff0c;封装成了可配置的BeanShell前置和后置处理器&#xff0c;分别是 BeanShell Pre…

IDEA前端thymeleaf只显示部分数据库问题

只显示int类型的number&#xff0c;不显示string类型的price和weight 先看一下apple.html <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>User List</title> </…

8086/8088 存储器分段概念

8086/8088 存储器分段概念 这一节主要讲述8086/8088 存储器分段的概念。 目的 从8086 CPU开始采用了分段的方法管理存储器&#xff0c;只有充分理解存储器分段的概念和存储器逻辑地址和物理地址的关系&#xff0c;才能有助于我们掌握8086/8088汇编语言。 存储器分段的原因 在此…

【ArcGIS Pro微课1000例】0033:ArcGIS Pro处理cad数据(格式转换、投影变换)

文章目录 一、cad dwg转shp1. 导出为shp2. cad至地理数据库3. data interoperability tools二、shp投影变换一、cad dwg转shp 1. 导出为shp 加载cad数据,显示如下: 选择需要导出的数据,如面状,右键→数据→导出要素: 导出要素参数如下,点击确定。 导出的要素不带空间参…

shell编程规范与变量

目录 一、shell的作用和规范 1.shell的作用 2.shell的执行顺序 3.shell的格式 4.执行shell脚本 1.直接调用shell解释器加上脚本的名字 2.路径加脚本名 绝对路径或相对路径 脚本文件需要有执行权限 3.直接运行 4.其他执行 5.执行环境 二、脚本的错误方…

Java学习day14:权限修饰符,集合(知识点+例题详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day13&#xff1a;泛型&…

Ajax基础(应用场景|jquery实现Ajax|注意事项)

文章目录 一、Ajax简介二、基于jquery实现Ajax三、使用Ajax注意的问题1.Ajax不要与form表单同时提交2.后端响应格式问题3、使用了Ajax作为请求后的注意事项 一、Ajax简介 AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。…

Python爬虫技术系列-03/4flask结合requests测试静态页面和动态页面抓取

python构建web服务 flask内容参考:Flask框架入门教程&#xff08;非常详细&#xff09; flask安装与运行测试 安装flask pip install flask创建一个webapp.py文件&#xff0c;内容如下 from flask import Flask# 用当前脚本名称实例化Flask对象&#xff0c;方便flask从该脚…

OpenHarmony Axios组件使用过程中,Api9不适配问题

大家好&#xff0c;我是【八戒&#xff0c;你又涨价了哎】 以下是我个人在学习OpenHarmony过程中的分享&#xff0c;请大家多多指教 目录 问题描述 解决方法 问题描述 使用axios组件的时候&#xff0c;把应用部署到开发板&#xff0c;提示Api9不适配 解决方法 对这类版本不…

基于Docker的安装和配置Canal

基本介绍 Canal介绍&#xff1a;Canal 是用 Java 开发的基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费的中间件&#xff08;数据库同步需要阿里的 Otter 中间件&#xff0c;基于 Canal&#xff09;。 Canal背景&#xff1a;阿里巴巴 B2B 公司&#xff0c;因为…

AI绘画使用Stable Diffusion(SDXL)绘制三星堆风格的图片

一、前言 三星堆文化是一种古老的中国文化&#xff0c;它以其精湛的青铜铸造技术闻名&#xff0c;出土文物中最著名的包括青铜面具、青铜人像、金杖、玉器等。这些文物具有独特的艺术风格&#xff0c;显示了高度的工艺水平和复杂的社会结构。 青铜面具的巨大眼睛和突出的颧骨&a…

【Web】Ctfshow Nodejs刷题记录

目录 ①web334 ②web335 ③web336 ④web337 ⑤web338 ⑥web339 ⑦web340 ⑧web341 ⑨web342-343 ⑩web344 ①web334 进来是一个登录界面 下载附件&#xff0c;简单代码审计 表单传ctfshow 123456即可 ②web335 进来提示 get上传eval参数执行nodejs代码 payload: …

【力扣面试经典150题】(链表)K 个一组翻转链表

题目描述 力扣原文链接 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只…

技术分享 | 如何写好测试用例?

对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中&#xff0c;我们将介绍测试用例设计常用的几种方法&#xff0c;以及如何编写高效的测试用例。 ## 一…

vue和uni-app的递归组件排坑

有这样一个数组数据&#xff0c;实际可能有很多级。 tree: [{id: 1,name: 1,children: [{ id: 2, name: 1-1, children: [{id: 7, name: 1-1-1,children: []}]},{ id: 3, name: 1-2 }]},{id: 4,name: 2,children: [{ id: 5, name: 2-1 },{ id: 6, name: 2-2 }]} ]要渲染为下面…

春秋云境靶场CVE-2022-30887漏洞复现(任意文件上传漏洞)

文章目录 前言一、CVE-2022-30887描述和介绍二、CVE-2021-41402漏洞复现1、信息收集2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随…

C语言中的指针(上)

目录 一、基本概念 1.变量的存储空间 2.定义指针 3.引用与解引用 二、指针的算术运算、类型以及通用指针 1.指针的算数运算 2.指针类型以及通用型指针 三、指向指针的指针&#xff08;pointers to pointers&#xff09; 四、函数传值以及传引用 1.局部变量 2.从存储地…