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

Shell脚本的基础和变量

1.shell脚本基础

1.1 shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当

了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执

行的操作传递给内核执行,并输出执行结果。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符

等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

查看本机的shell信息

查看当前的系统支持的shell

1.2linux中常见的shell

  • bash:基于gun的框架下发展的shell
  • csh:类似c语言的shell
  • tcsh:整合了csh提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

1.3shell脚本的本质

shell脚本的本质:命令的集合,命令的本质是程序,那么shell脚本的本质是程序;人类写了一个命令的集合,用bash这个软件,将命令交给硬件去执行;

shell脚本的特点:虽然linux一切皆文件,但是习惯还是将脚本以".sh"结尾,vim编辑器会给脚本中的命令

1.4shell脚本用途

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
  • 减少手工命令的重复输入,一定程度上避免人为错误
  • 将软件或应用的安装及配置实现标准化
  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.5脚本执行逻辑及执行方式

1.51脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 循环执行:程序执行过程中需要重复执行多次某段语句

1.5.2脚本执行方式

使用指定的shell解释器:(不需要脚本有执行权限)

会重新加载一个子bash环境去执行,不会影响当前bash环境变量值,常使用。

  • 使用路径执行,需要权限

绝对路径。如:/data/test.sh

相对路径。如:./test.sh

③使用 “source 脚本名” 或 “ . 脚本名”执行脚本,不需要权限

①和②执行方式不会影响当前环境中bash设置,会开启一个全新的bash环境执行脚本

③不推荐使用,不会启动子shell环境,会影响当前bash环境中的配置

1.6脚本错误调试

1.命令错误

命令出错不会影响接下来的命令继续

hostname

echo 'finsh'

​2.语法错误

会影响接下来的命令继续

echo "hello world"

hstname

​cat > /data/kgc.tx <<EOF

123

123

EOF

echo "ni hao"

 3.逻辑错误

只能自己去筛查

查代码的正确

bash-n 脚本名称 (不在当前目录下加绝对路径)    

检查语法错误

bash-x脚本名称 (不在当前目录下加绝对路径)     逻辑错误

#将脚本的所有语句执行一遍,

总结:脚本错误常见的有三种区别

  • 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
  • 逻辑错误:只能使用 bash -x 进行

命令错误调试:

在脚本的前面输入 `set -e` ,一旦出错立即停止 

bash -n 脚本名称     //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。 

bash -x 脚本名称     //显示每个命令的执行过程,方便发现逻辑错误

 

1.7重定向与管道符

1.71重定向

类型

设备文件

文件描述编号

默认设备

标准输入

/dev/stdin

0

键盘

标准输出

/dev/stdout

1

显示器

标准错误输出

/dev/stderr

2

显示器

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据(echo “123” |passwd  --stdin xueyin
  • 标准输出:通过该设备向用户输出数据    ls  /opt
  • 标准错误:通过该设备报告执行出错信息 (ls xxxxxx)

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)

类型

操作符

用途

重定向输入

<

从指定的文件读取数据,而不是从键盘输入

重定向输出

1>

将输出结果保存到指定的文件(覆盖原有内容)

 

>>

将输出结果追加到指定的文件尾部

标准错误输出

2>

将错误信息保存到指定的文件(覆盖原有内容)

2>>

标准错误输出结果追加到指定的文件尾部

混合输出

&>无论对错都可以重定向

将标准输出、标准错误的内容保存到同一个文件中

重定向输入

重定向输出覆盖和追加

第一种,/dev/pts改变输出的终端显示器

第二种:>覆盖

第三种:>>追加

1.72管道符

管道符       |  

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

格式:cmd1 | cmd2

2.变量

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

保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

变量基础以及常见的shell变量的类型

变量有5种类型:①自定义变量(自己定义的)、②环境变量(这是系统维护的,如PATH等)、③只读变量、④位置变量、⑤预定义变量

关于自定义变量的命名要求:需要区分大小写、不能使用程序中的保留变量名称,只能使用数字、字母、下划线,且不能以数字开头,注意不支持短横线“-”

命名要求

区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname   命令  a=  
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反   
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH             
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

name='value'

变量名=变量值

直接字串:name='root'

变量引用:name="$USER"

命令引用:name=`COMMAND` 或者 name=$(COMMAND)

注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

特殊符号

大括号{ }

{ }确定的变量起始结束的范围 ,只要有变量就加

" "弱引用可以识别变量

' '强引用不识别 变量

` `反撇 调用命令的执行结果 效果与 $()相同

整数运算

expr只能进行整数的运算

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

运算符:

加法 +

减法 -

乘法 \ *

除法 /

取余 (取模)%

let var=算术表达式

((var=算术表达式)) 和上面等价

变量1=`expr 变量2  运算符  变量3`(注意空格

使用反撇号调用expr的运算结果,给变量赋值

变量1=$(expr 变量2  运算符  变量3)(注意空格)

使用$()调用expr的运算结果,给变量赋值

环境变量

常用的环境变量,这些都是由系统定义的

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

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

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

环境变量:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用

每开一个窗口就会新加载一个bash,在当前bash下输入bash,就会生成一个子bash,关于环境变量,子bash不会继承父bash的变量值,除非父bash加上export进行变量申明

环境变量的全局配置文件

配置文件位置在

/etc/profile如果修改此文件会作用于所有用户

~/.bash_profile  用户独立的配置文件,修改这个文件只作用于当前用户

可以用来长期变更或设置环境变量

[root@host1:~# ]vim  /etc/profile

.....................省略到行末添加

export PATH=$PATH:/root

[root@host1:~# ]source  /etc/profile

source立即生效或 .

预定义变量

bash   帮你定义好了  拿来用就可以了,你不需要知道为什么,记住

  • $*:表示所有位置参数的内容看成一个整体返回      返回所有         
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回   返回所有 
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称     当前脚本的名字
  • $$:当前bash的进程id   
  • $!:  后台
  • 任务最后一个id

$? 返回上一次的执行结算,0是正确,非0是错误

$$ 输出当前bash的pid

$0 表示脚本的名称

$# 表示位置参数的总个数

位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

只读变量

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

无法使用 unset删除

最快方法重启

相关文章:

Shell脚本的基础和变量

1.shell脚本基础 1.1 shell的作用 Linux 系统中的 Shell 是一个特殊的应用程序&#xff0c;它介于操作系统内核与用户之间&#xff0c;充当 了一个“命令解释器”的角色&#xff0c;负责接收用户输入的操作指令&#xff08;命令&#xff09;并进行解释&#xff0c;将需要执 行的…...

VRRP协议-负载分担配置【分别在路由器与交换机上配置】

VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…...

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…...

思源笔记如何结合群晖WebDav实现云同步数据

文章目录 1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 在数字化时代&#xff0c;信息的同步与共享变得尤为重要。无论是个人用户还是企业团队&#xff0c;都渴望能够实现跨…...

Electron Forge | 跨平台实战详解(中)

简介 上篇 介绍了 Electron 和 Electron Builder 的基本用法&#xff0c;本篇将介绍更常用也更方便的打包工具&#xff0c;Electron Forge 。 Electron Forge 是一个为 Electron 应用的开发、打包和分发而设计的全功能工具集。它整合了多个底层 Electron 工具到一个统一的命令…...

stable diffusion教程

Stable Diffusion 是一种流行的图像生成模型&#xff0c;它可以根据文本提示生成高质量的图片。如果你想了解如何使用 Stable Diffusion&#xff0c;这里有一些基本的步骤和资源&#xff0c;可以帮助你开始使用&#xff1a; ### 1. 安装 Stable Diffusion 首先&#xff0c;你需…...

音频文件分析-- whisper(python 文档解析提取)

使用whisper转文本&#xff0c;这里使用的是large-v3版本 pip install githttps://github.com/openai/whisper.git import whisper import os from tqdm import tqdmmodel whisper.load_model("large-v3")path "rag_data" for fi in tqdm(os.listdir(pa…...

Python深度学习基于Tensorflow(3)Tensorflow 构建模型

文章目录 数据导入和数据可视化数据集制作以及预处理模型结构低阶 API 构建模型中阶 API 构建模型高阶 API 构建模型保存和导入模型 这里以实际项目CIFAR-10为例&#xff0c;分别使用低阶&#xff0c;中阶&#xff0c;高阶 API 搭建模型。 这里以CIFAR-10为数据集&#xff0c;C…...

火爆多年的抖音小店,2024年想要入驻需要什么条件呢?

大家好&#xff0c;我是电商糖果 我相信现在只要会上网的年轻人&#xff0c;对抖音小店一定不会感觉陌生。 它最近几年的风头&#xff0c;可是远远超过某宝&#xff0c;某多多了。 不少抖音用户也有了在抖音购物的习惯&#xff0c;现在的抖音上入驻了上百万家电商商家。 这…...

STM32G030C8T6:EEPROM读写实验(I2C通信)

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;实现PB11,PB10 引脚模拟I2C 时序&#xff0c;对M24C08 的EEPRO…...

使用Git管理github的代码库-上

1、下载安装Git https://download.csdn.net/download/notfindjob/11451730?spm1001.2014.3001.5503 2、注册一个github的账号&#xff08;已经注册的&#xff0c;可略过这一步&#xff09; 3、打开git命令行&#xff0c;配置github账号 git config --global user.name &quo…...

经典文献阅读之--D-Map(无需射线投射的高分辨率激光雷达传感器的占据栅格地图)

0. 简介 占用地图是机器人系统中推理环境未知和已知区域的基本组成部分。《Occupancy Grid Mapping without Ray-Casting for High-resolution LiDAR Sensors》介绍了一种高分辨率LiDAR传感器的高效占用地图框架&#xff0c;称为D-Map。该框架引入了三个主要创新来解决占用地图…...

开源免费的定时任务管理系统:Gocron

Gocron&#xff1a;精准调度未来&#xff0c;你的全能定时任务管理工具&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发&#xff0c;是一个轻量级定时任务集中调度和管理系统&#xff0c;用于替代L…...

从零开始详解OpenCV车道线检测

前言 车道线检测是智能驾驶和智能交通系统中的重要组成部分&#xff0c;对于提高道路安全、交通效率和驾驶舒适性具有重要意义。在本篇文章中将介绍使用OpenCV进行车道线的检测 详解 导入包 import cv2 import matplotlib.pyplot as plt import numpy as np读入图像并灰度化…...

【Java代码审计】逻辑漏洞篇

【Java代码审计】逻辑漏洞篇 逻辑漏洞概述常见逻辑漏洞点 逻辑漏洞概述 逻辑漏洞一般是由于源程序自身逻辑存在缺陷&#xff0c;导致攻击者可以对逻辑缺陷进行深层次的利用。逻辑漏洞出现较为频繁的地方一般是登录验证逻辑、验证码校验逻辑、密码找回逻辑、权限校验逻辑以及支…...

SSH简介

SSH&#xff0c;全名叫Secure Shell&#xff0c;你可以想象它是一个超级安全的管道&#xff0c;专门用来远程操控电脑的。就好比你在家用遥控器指挥远处的电视换台&#xff0c;但比这高级多了&#xff0c;因为它是专门为电脑设计的。 为什么需要SSH&#xff1f; 在互联网的早期…...

Oracle的高级分组函数grouping和grouping_id

在网上对Oracle的高级分组函数grouping和grouping_id的讲解并不多,特别是grouping_id,还有解说有误的。经过1天研究,已经完全掌握了两个函数的作用和用法,下面简单的讲述即可明白。下面给大家分享。 GROUPING 函数 语法:grouping(表达式) 作用: GROUPING将超聚…...

SqlServer 查询数据库 和 数据表 大小的语句

–Sqlserver 查询数据库 大小 SELECT * FROM (SELECT DB_NAME(database_id) AS DatabaseName,type_desc AS FileType,name AS FileName,size * 8 / 1024/1024 AS FileSizeGBFROM sys.master_filesWHERE type 0 -- 数据文件AND state 0 -- 在线状态 ) T1 ORDER BY FileSizeG…...

特殊类的设计与单例模式

1、特殊类的设计 如何设计出一个创建出的对象只能在堆上的类&#xff1f;将类的默认构造函数设置为私有&#xff0c;再将类的拷贝构造函数设置为delete&#xff0c;设置静态函数GetObj&#xff0c;内部调用new HeapOnly&#xff0c;这样就只能在堆上开辟空间。 class HeapOnly…...

MySQL从入门到高级 --- 6.函数

文章目录 第六章&#xff1a;6.函数6.1 聚合函数6.2 数学函数6.3 字符串函数6.4 日期函数6.4.1 日期格式 6.5 控制流函数6.5.1 if逻辑判断语句6.5.2 case when语句 6.6 窗口函数6.6.1 序号函数6.6.2 开窗聚合函数6.6.3 分布函数6.6.4 前后函数6.6.5 头尾函数6.6.6 其他函数6.7 …...

Qt---信号和槽

一、信号和槽机制 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这个信号…...

POCEXP编写—文件上传案例

POC&EXP编写—文件上传案例 1. 前言2. 文件上传案例2.1. Burp抓包2.2. 基础代码实践2.2.1. 优化代码 2.3. 整体代码2.3.1. 木马测试 1. 前言 之前的文章基本上都是一些相对来说都是验证类的或者说是一些代码执行类的&#xff0c;相对来说都不是太复杂&#xff0c;而这篇会…...

C#知识|上位机UI设计-详情窗体设计思路及流程(实例)

哈喽,你好啊,我是雷工! 上两节练习记录了登录窗体和主窗体的实现过程,本节继续练习内容窗体的实现,以下为练习笔记。 01 详情窗体效果展示: 02 添加窗体并设置属性 在之前练习项目的基础上添加一个Windows窗体,设置名称为:FrmIPManage.cs 设置窗体的边框和标题栏的外…...

目标检测——印度车辆数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …...

Zotero Word中插入带超链接的参考文献

Zotero 超链接 找了好多原代码&#xff0c;最接近能实施的为&#xff1a; https://blog.csdn.net/weixin_47244593/article/details/129072589 但是&#xff0c;就是向他说的一样会报错&#xff0c;我修改了代码&#xff0c;遇见报错的地方会直接跳过不执行&#xff0c;事后找…...

如何在服务器上下载,解压github上的代码

在github上找到对应仓库&#xff0c;找到平时download zip的地方&#xff0c;右键它&#xff0c;复制链接。在远程的终端里使用wget 链接 命令就可以得到zip了。 解压方法&#xff1a; -c &#xff1a;新建打包文件 -t &#xff1a;查看打包文件的内容含有哪些文件名 -x &…...

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由&#xff0c;会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP&#xff0c;但如果也从IGP学习到了这条路由&#xff0c;就发…...

Docker学习(带图详细)

一、安装docker 参考官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 查看系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# [rootlocalhost ~]# uname -a Linux localhost.localdomai…...

RabbitMQ 如何使用延迟队列

RabbitMQ 如何使用延迟队列 目录 前置条件场景描述RabbitMQ 延迟队列机制实现步骤 1. 安装 RabbitMQ 延迟队列插件2. 创建延迟队列和交换机3. 发布延迟消息4. 消费延迟消息 示例代码 1. 延迟队列配置2. 发布消息的 Producer 代码3. 消费消息的 Consumer 代码 注意事项 前置条…...

【C++】栈和队列

目录 前言 一、stack 1. 栈的定义 2. 成员函数 二、queue 1. 队列的定义 2. 成员函数 三、priority_queue 1. 优先队列的定义 2. 成员函数 前言 栈和队列是STL中很重要的两个容器&#xff0c;栈的特点是先进后出&#xff1b;队列的特点是先进先出。还有优先队列&…...