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 :输入等待时间(单位默认为秒)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Shell判断:模式匹配:case(一)

一、前言 shell编程中if和case都是用来做流控的。 二、case语法结构 case 变量 in 模式1&#xff09; 命令序列1 ;; 模式2&#xff09; 命令序列2 ;; 模式3&#xff09; 命令序列3 ;; *) 无匹配…

电脑游戏录屏软件,记录游戏高光时刻

电脑游戏录制是游戏爱好者分享游戏乐趣、技巧和成就的绝佳方式&#xff0c;此时&#xff0c;一款好用的录屏软件就显得尤为重要。本文将为大家介绍三款电脑游戏录屏软件&#xff0c;通过对这三款软件的分步骤详细介绍&#xff0c;让大家更加了解它们的特点及使用方法。 电脑游戏…

​vmware虚拟机ubuntu系统配置静态ip​

把虚拟机当成服务器&#xff0c;如果虚拟机的ip是一直变化的&#xff0c;每次远程连接需要都修改连接虚拟机的ip地址&#xff0c;这肯定是麻烦的。 一、设置一下本机的VMnet8的ip 配置路径&#xff1a;控制面板->所有控制面板项->网络和共享中心 二、首先设置NAT 选自…

css 实现文字流光效果

经过调研发现大多滑块验证码中&#xff0c;有一些文字流光效果&#xff0c;因此在这里简单实现一下。 实现主要利用background 渐变背景以及backgorund-clip:text实现。具体代码如下 css部分 .slide {width: 300px;height: 40px;border: 1px solid #ccc;border-radius: 8px;…

IDEA中更换java项目JDK

我们打开IDEA 打开项目 然后选择 File 下的 Project Structure 这里 我们下拉选择自己需要的JDK Sources这里 也要设置一下JDK对应版本 然后 上面这个 Project 中 也要设置一下对应jdk的版本 保持一直 然后 我们打开 File 下的 Settings 然后 找到如下图配置 如果JKD版本看…

vue3之echarts区域折线图

vue3之echarts区域折线图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"per">单位&#xff1a;{{ obj.data?.unit }}</div><div class"chart" ref"chartsRef"&g…

Linux 时区设置

对于服务器来说&#xff0c;linux的时区影响着运行之上的数据库和后端程序的时区 应该和数据库和后端及其他程序的时区保持一致 其他相关时区的设置 pgsql时区设置&#xff1a; php时区设置&#xff1a; 1.显示当前的时间和时区 date结果类似下面&#xff0c;图中显示的是ut…

macos苹果电脑清理软件有哪些?cleanmymac和腾讯柠檬哪个好

MacOS是一款优秀的操作系统&#xff0c;但是随着使用时间的增加&#xff0c;它也会产生一些不必要的垃圾文件&#xff0c;占用磁盘空间和内存资源&#xff0c;影响系统的性能和稳定性。为了保持MacOS的清洁和高效&#xff0c;我们需要使用一些专业的清理软件来定期扫描和清除这…

C#,数值计算——插值和外推,分段线性插值(Linear_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 分段线性插值 /// Piecewise linear interpolation object. /// Construct with x and y vectors, then call interp for interpolated values. /// </summary> …

【机器学习】032_多种神经网络层类型

一、密集层 每一层神经元都是上一层神经元的函数&#xff0c;每层每个神经元都从前一层获得所有激活的输入。 整个神经网络前一层与后一层连接在一起&#xff0c;构造的网络密集。 二、卷积层 假设有一张大小为axb像素的图片&#xff0c;上面标着一些手写数字&#xff0c…

第十三章 枚举类型与泛型

13.1 枚举类型 枚举类型是一种特殊的数据类型&#xff0c;它允许一个变量只能取预先定义好的一组离散值中的一个。在许多编程语言中&#xff0c;枚举类型通常用于表示具有一定范围内固定取值的情况&#xff0c;例如星期几、月份等。 13.1.1使用枚举类型设置常量 在Java中&…

从0开始学习JavaScript--深入探究JavaScript类型化数组

JavaScript类型化数组是一种特殊的数组类型&#xff0c;引入了对二进制数据的更底层的操作。这种数组提供了对内存中的二进制数据直接进行读写的能力&#xff0c;为处理图形、音频、视频等大规模数据提供了高效的手段。本文将深入探讨JavaScript类型化数组的基本概念、常见类型…

【云栖 2023】林伟:大数据 AI 一体化的解读

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;林伟 | 阿里云研究员&#xff0c;阿里云计算平台事业部首席架构师&#xff0c;阿里云人工智能平台 PAI 和大数据开发治理平台 DataWorks 负责人 演讲主题&#xff1a…

V100 GPU服务器安装CUDA教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

uniapp和vue3+ts创建自定义下拉选择框组件

使用uniapp开发小程序的时候&#xff0c;使用了uview的ui组件&#xff0c;但是里面没有下拉选择组件&#xff0c;只有Picker 选择器&#xff0c;但是我们想要使用下拉选择的组件&#xff0c;所以需要自定义个一个下拉选择的自定义组件&#xff0c;我就只能自己动手创建这个自定…

5月22日比特币披萨日,今天你吃披萨了吗?

比特币披萨日 1. Laszlo Hanyecz2. 最贵披萨诞生记3. 梭哈买披萨4. 未完待续 2010年5月22日&#xff0c;美国佛罗里达州的程序员Laszlo Hanyecz&#xff08;拉兹洛哈涅克斯&#xff09;用10000个比特币购买了棒约翰&#xff08;Papa Johns&#xff09;比萨店一个价值25美元的奶…

【Linux】指令详解(一)

目录 1. 前言2. 与指令相关的知识2.1 文件2.2 路径 3. 常见指令3.1 pwd3.2 ls3.2.1 ls -l3.2.2 ls -la 3.3 mkdir3.4 cd3.5 clear3.6 touch 1. 前言 来学习一些Linux的指令和一些相关的知识。 第一步那肯定是打开自己的xshell。 这里可以修改字体和大小。 可以使用ctrl回车全…

【汇编】“转移”综述、操作符offset、jmp指令

文章目录 前言一、转移综述1.1 :背景&#xff1a;1.2 转移指令1.3 转移指令的分类按转移行为根据指令对IP修改的范围不同 二、操作符offset2.1 offset操作符是干什么的&#xff1f;标号是什么&#xff1f; 2.2 nop是什么&#xff1f; 三、jmp指令3.1 jmp指令的功能3.2 jmp指令&…

Python - Wave2lip 环境配置与 Wave2lip x GFP-GAN 实战 [超详细!]

一.引言 前面介绍了 GFP-GAN 的原理与应用&#xff0c;其用于优化图像画质。本文关注另外一个相关的项目 Wave2lip&#xff0c;其可以通过人物视频与自定义音频进行适配&#xff0c;改变视频中人物的嘴型与音频对应。 二.Wave2Lip 简介 Wave2lip 研究 lip-syncing 以达到视频…

工具及方法 - 多邻国: Duolingo

网站&#xff1a;Duolingo 有iOS和Android应用&#xff0c;在App Store和Google Play上都能下载。也可以使用网页版。我就在iOS上安装了付费版&#xff0c;为了小朋友学习英语&#xff0c;一年的费用&#xffe5;588。 目前学习中的课程是英语、日语和粤语。英语是小学课程&a…