【Linux脚本篇】什么是shell脚本,什么是shell变量

news2024/11/26 20:23:55

44a3b7856c454e9ca841accc870a27c4.gif

目录

🍁什么是shell

🍂什么是shell脚本

🍂shell脚本能做什么

🍂学习shell需要哪些知识

🍂shell基本规范

🍂shell脚本五种运行方式

🍁shell变量

🍂变量命名规范

🍂shell变量定义的方式

🍃自定义变量

🍃系统环境变量

🍃预定义变量

🍃位置变量

🍃补充变量

🍂shell变量赋值

🍂脚本题


   🦐博客主页:大虾好吃吗的博客

   🦐专栏地址:Linux从入门到精通

什么是shell

命令解释器,位于系统最外层,负责人机对话:命令的翻译输入和处理结果输出

什么是shell脚本

        将系统命令放在一起,顺序执行,即系统命令堆积; 特定格式、特定语法、系统命令,共同组成的文件

shell脚本能做什么

基础配置:系统初始化操作、系统更新、内核调整、网络、时区

安装程序:部署LNMP、LAMP、LMT、mysql、nginx、Redis

配置变更:nginx conf、PHP conf、mysql conf、Redis conf

业务部署:shell配合git、jenkins实现自动化部署以及回滚

日常备份:使用shell脚本对mysql进行全备和增备

信息采集:zabbix+shell,硬件、系统、服务、网络

日志分析:取值、排序、去重、统计、分析

服务扩容:监控脚本监控服务器集群cpu使用率,超出80%触发动作脚本 (调用api开通云主机,初始化、加集群)

服务缩容:监控脚本监控服务器集群cpu使用率,低于20%触发动作脚本 (查看节点数,判断预设值,释放节点)

总结:简化工作,避免重复性、周期性操作,减少故障几率

学习shell需要哪些知识

        熟练vim辑编器 熟练Linux命令 熟练Linux三剑客grep sed awk 学习方法:基础命令、基础服务、大量练习、思路

shell基本规范

        脚本存放在固定目录 开头#!/bin/bash,指定命令解释器 作者和版本 扩展名.sh,便于识别 复杂脚本,添加必要注释 成对符号一次书写完成 循环格式一次性输入完成 脚本中文件必须使用绝对路径

        vim test1.sh #!/usr/bin/bash 脚本中不写,如果./执行,默认调用bash翻译 脚本中写了解释器,使用./执行直接调用相应解释器

shell脚本五种运行方式

  1. ./脚本名 相对路径方式运行必须有x权限

  2. sh 脚本名

  3. source 脚本名 以root身份运行可以没有x权限

  4. . 脚本名

  5. /sh/test.sh 绝对路径方式运行必须有x权限

shell变量

变量是shell传递数据的一种方法,即用一个固定的字符串去表示不固定的值,便于后期引用

变量命名规范

命名要求:字母、数字、下划线组成,字母开头(不能使用数字开头)

类型:字符类型(不能用于计算)、数值类型(可以计算)

符号:'' 单引号 "" 双引号 `` 反撇号

'' 表示字符串(不对变量进行解释)

"" 表示字符串(对变量进行取值操作)

`` 反撇号 表示将一个命令的执行结果赋值给一个变量(不能嵌套使用)

$() 表示将一个命令的执行结果赋值给一个变量(可以嵌套) 例:$($()) 可以使用

注意:所有符号必须是英文符号 () () '' ‘’

变量名尽量具备一定含义,但不要和系统命令冲突;等号赋值,两边不能空格

例1:

[root@daxia ~]# ip=192.168.8.100                #不要和已有的系统命令冲突
[root@daxia ~]# HostName_Ip=192.168.8.100       #推荐驼峰式命名

例2:

[root@daxia ~]# HostName=$(hostname)            #定义hostname为HostName
[root@daxia ~]# echo $HostName                  #查看变量可以看到主机名

shell变量定义的方式

用户自定义变量:人为定义变量名称

系统环境变量:系统操作环境相关数据

位置参数变量:向脚本传递参数,名称固定,作用固定

预定义变量:bash定义好的变量,名称固定,作用固定

自定义变量

(1) 变量名不能出现"-"横杠(可以下划线),变量值有空格需要引号括起来

[root@daxia ~]# var="hello world"
[root@daxia ~]# echo $var
hello world

(2) 引用变量,$变量名 或 ${变量名}

[root@daxia ~]# echo $var                   #正常查看变量
hello world
[root@daxia ~]# echo $var_log               #变量无法引用
​
[root@daxia ~]# echo ${var}_log             #变量可以引用
hello world_log

注意:在变量链接字符串时,需要将变量使用{}阔起

(3) 查看变量,set显示所有变量(自定义和环境变量)

[root@daxia ~]# set | grep var

(4) 取消变量,作用范围:当前shell

[root@daxia ~]# unset var

(5) 引用变量,"" 双引号属于弱引用,‘’单引号属于强引用

[root@daxia ~]# var="hello world"
[root@daxia ~]# echo "$var hello china"                             #需要引用变量值
hello world hello china
[root@daxia ~]# echo '$var hello china'                             #只想引用变量名,不执行$特殊符号
$var hello china
[root@daxia ~]# echo "$var hello china $SHELL"                       #部分变量执行,部分变量不执行
hello world hello china /bin/bash

(6) 变量命令赋值,使用反撇号或者$()

[root@daxia ~]# Ip=`ifconfig ens33 | grep 'inet' | grep -v inet6 | awk '{print $2}'`
[root@daxia ~]# Ip=$(ifconfig ens33 | grep 'inet' | grep -v inet6 | awk '{print $2}')
#两种方法都可以赋值,但区别是反撇号无法嵌套
[root@daxia ~]# echo $Ip
192.168.8.1

系统环境变量

(1) 使用系统已定义好的变量

export

echo "宿主目录: $HOME"

echo "当前目录: $PWD"

echo "主机名: $HOSTNAME"

echo "客户端地址和端口: $SSH_CONNECTION"

环境变量配置文件:

/etc/profile (全局配置文件)

/root/.bash_profile (root用户的局部配置文件)

/home/test/.bash_profile (test用户的局部配置文件)

(2) 自定义环境变量

[root@daxia ~]# var1="hello beijing"			#定义局部变量,子shell不识别
[root@daxia ~]# cat >> env.sh << END
> #!/bin/bash
> echo $var1
> END
[root@daxia ~]# sh env.sh
hello beijing

[root@daxia ~]# export var1						#把局部变量发布到全局,子shell也识别

预定义变量

[root@daxia ~]# vim variable.sh
#!/bin/bash 
echo "当前shell脚本的文件名:$0"
echo "第1个shell脚本位置参数:$1"
echo "第2个shell脚本位置参数:$2"
echo "第3个shell脚本位置参数:$3"
echo "第10个shell脚本位置参数:${10}"
echo "所有传递的位置参数:$*"
echo "所有传递的位置参数:$@"
echo "总共传递的参数数量:$#"
echo "当前程序运行的PID:$$"
echo "上一个命令执行的返回结果:$?"  					#0成功  非0都是失败

查看结果

[root@daxia ~]# sh variable.sh 11 22 33 44 55 66 77 88 99 100
当前shell脚本的文件名:variable.sh
第1个shell脚本位置参数:11
第2个shell脚本位置参数:22
第3个shell脚本位置参数:33
第10个shell脚本位置参数:100
所有传递的位置参数:11 22 33 44 55 66 77 88 99 100
所有传递的位置参数:11 22 33 44 55 66 77 88 99 100
总共传递的参数数量:10
当前程序运行的PID:100488
上一个命令执行的返回结果:0

$* 和 $@ 的区别:

        不加引号两者结果相同;加引号,$*把参数作为整体,$@把参数作为分散个体(脚本里面写了function和for语句,这里不用过多纠结,后面会讲解)。

[root@daxia ~]# vim variable1.sh
#!/bin/bash
test() {
		echo "未加引号,两者相同"
		echo $*
		echo $@
		
		echo "添加引号,两者对比"
		
		echo "----"\$*----""
			for I in "$*"
			do
				echo $I
			done
		echo "----"\$@----""
			for I in "$@"
			do
				echo $I
			done				
}
test 11 22 33 44

查看结果

[root@daxia ~]# sh variable1.sh
未加引号,两者相同
11 22 33 44
11 22 33 44
添加引号,两者对比
----$*----
11 22 33 44
----$@----
11
22
33
44

位置变量

位置变量是预定义变量的一部分,是定义脚本后的参数位置的。 $1 $2 $3 . . $9 ${10}

补充变量

将命令执行结果传给变量(命令替换)

例1:打印今年和明年的时间

[root@daxia ~]# echo "今年是 $(date +%Y) 年"
今年是 2023 年
[root@daxia ~]# echo "明年是 $(($(date +%Y)+1)) 年"
明年是 2024 年

例2:命令的嵌套使用

[root@daxia ~]# Back=$(tar zcf /backup/root.tar.gz $(find /root/ -name "*.txt"))

测试命令 test

数值测试

-eq 等于则为真

-ne 不等于则为真

-gt 大于则为真

-ge 大于等于则为真

-lt 小于则为真

-le 小于等于则为真

字符串测试

= 等于则为真

!= 不相等则为真

-z 字符串 字符串的长度为零则为真

-n 字符串 字符串的长度不为零则为真

文件测试

-e 文件名 如果文件存在则为真

-r 文件名 如果文件存在且可读则为真

-w 文件名 如果文件存在且可写则为真

-x 文件名 如果文件存在且可执行则为真

-s 文件名 如果文件存在且至少有一个字符则为真

-d 文件名 如果文件存在且为目录则为真

-f 文件名 如果文件存在且为普通文件则为真

-c 文件名 如果文件存在且为字符型特殊文件则为真

-b 文件名 如果文件存在且为块特殊文件则为真

shell变量赋值

        除了自定义和环境变量,还可以使用read进行交互式传递变量 ​ 例1:使用交互式指定备份目录、备份目标目录

[root@daxia ~]# vim read1.sh
#!/bin/bash
read -p "请输入备份的目录:" Dir
read -p "请输入备份到哪个目录:" Bak
echo "你要备份的目录是:${Dir}"
echo "-----正在备份${Dir}-----"
tar zcf "/${Bak}/${Dir}.tar.gz" /${Dir} &> /dev/null
echo "-----备份${Dir}完成-----"

查看结果

[root@daxia ~]# sh read1.sh 
请输入备份的目录:root 
请输入备份到哪个目录:backup
你要备份的目录是:root
-----正在备份root-----
-----备份root完成-----
[root@daxia ~]# ll /backup/
总用量 3112
-rw-r--r--. 1 root root 3182694 4月   8 11:29 root.tar.gz

例2:输入bak_dir2返回结果

[root@daxia ~]# vim read2.sh
#!/bin/bash
back_dir1=/backup
read -p "请输入你的备份目录:" back_dir2
echo $back_dir1
echo /$back_dir2

查看结果

[root@daxia ~]# sh read2.sh 
请输入你的备份目录:back
/backup
/back

例3-1:输入IP监测是否可以通信

[root@daxia ~]# vim read3.sh
#!/bin/bash 
read -p "请输入需要检测的ip地址:" IP
ping -w1 -c1 $IP &> /dev/null
​
if [ $? -eq 0 ];then
        echo -e  "\033[32m $IP 可以通信 \033[0m"
else
        echo -e "\033[31m $IP 不可通信 \033[0m"
fi

查看结果

[root@daxia ~]# sh read3.sh 
请输入需要检测的ip地址:192.168.8.1
 192.168.8.1 可以通信 
[root@daxia ~]# sh read3.sh 
请输入需要检测的ip地址:192.168.8.8
 192.168.8.8 不可通信

例3-2:查看1到254网址是否可以通信

[root@daxia ~]# vim read3-2.sh
#!/bin/bash
IP=192.168.8.
for i in {1..254}
do
ping -w 1 -c 1 ${IP}$i &> /dev/null
if [ $? -eq 0 ];then
        echo -e "\033[32m ${IP}$i 可以通信 \033[0m"
else
        echo -e "\033[31m ${IP}$i 不可通信 \033[0m"
fi
done

查看结果

[root@daxia ~]# sh read3-2.sh 
 192.168.8.1 可以通信 
 192.168.8.2 不可通信 
 192.168.8.3 不可通信
#省略部分内容

例4:使用read修改主机名和ip

[root@daxia ~]# vim read4.sh
#!/bin/bash
read -p "请输入你想修改的主机名:" HostName
read -p "你确定要修改如下内容,[Y|N]:" RC
if [ $RC == "Y" ];then
        hostnamectl set-hostname $HostName
        bash
else
        exit
fi

查看结果

[root@daxia ~]# sh read4.sh 
请输入你想修改的主机名:bj_z3
你确定要修改如下内容,[Y|N]:Y
[root@bj_z3 ~]#

脚本题

在每月第一天备份并压缩/etc目录的所有内容,放到/backup,备份文件以时间戳命名。

1. 备份目录在哪,/backup

2. 备份目标是谁,/etc

3. 命令,tar

4. 时间戳命名,$(date +%F)

[root@bj_z3 ~]# vim backup.sh
#!/bin/bash
Back_dir=/backup
​
if [ -d $Back_dir ];then
    tar zcf $Back_dir/etc_$(date +%F).tar.gz /etc 
else
    mkdir /backup && tar zcf $Back_dir/etc_$(date +%F).tar.gz /etc 
fi

执行计划任务

[root@bj_z3 ~]# crontab -e
30 23 1 * * /bin/bash /sh/backup.sh 

 

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

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

相关文章

配置 RT-Thread 的工程目录

1. 前言 RT-Thread 基于 Scons 的包管理非常方便让我们使用 RT-Thread 进行开发&#xff0c;但在实际工程中将应用代码写到 RT-Thread 官方提供的 bsp 目录下面会非常不便于使用&#xff0c;无法使用自己 git 工具进行代码管理。 解决方式&#xff0c;可以是 fork 出一个基于特…

Python 依赖库管理:pipreqs、pigar、pip-tools、pipdeptree

在 Python 的项目中&#xff0c;如何管理所用的全部依赖库呢&#xff1f;最主流的做法是维护一份“requirements.txt”&#xff0c;记录下依赖库的名字及其版本号。 那么&#xff0c;如何来生成这份文件呢&#xff1f;一种常规的方法&#xff1a; pip freeze > requiremen…

从零开始学习Web自动化测试:如何使用Selenium和Python提高效率?

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 引言&#xff1a; 一、了解Web自动化测试的基本概念 二、选择Web自动化测试工具 三、学习Web自动化测试的…

企业数据挖掘平台|道路运输安全大数据分析解决方案

TipDM大数据挖掘建模平台是由泰迪智能科技自主研发打造的可视化、一站式、高性能的数据挖掘与人工智能建模服务平台。目前已与民政、广电、电力、交通运输等多个行业的100客户达成及合作。 基于数据挖掘平台的道路运输安全大数据分析解决方案如下&#xff1a; 方案背景 …

U盘数据加密怎么设置?这个方法更快速、更安全!

U盘是目前使用率最高的移动储存设备&#xff0c;有时我们需要使用U盘存放非常重要的数据&#xff0c;那么就需要将其进行加密。常见的加密手段&#xff0c;如BitLocke驱动器加密&#xff0c;它的加密速度非常慢&#xff0c;当U盘中的数据稍微多一点的时候&#xff0c;我们就需要…

分不清信息化、数字化的区别?这篇文章让你全明白

前几天看到一篇讲数字化的文章&#xff0c;把信息化和数字化混为一谈&#xff0c;一些企业在实践转型的时候也分不清数字化和信息化之间的区别。 正好借这个问题尝试梳理一下数字化和信息化之间的本质区别。个人拙见&#xff0c;也欢迎大家评论区探讨。 01 业务侧重点不同 信…

上传了ipa但iTunes Connect没有构建版本问题

上传了ipa但iTunes Connect没有构建版本问题 转载&#xff1a;上传了ipa但iTunes Connect没有构建版本问题 AU上传ipa出现下图红框提示说明成功上传&#xff0c;如果App Store后台没有出现构建版本&#xff0c;请登录 apple账号对应的邮箱查看反馈&#xff0c;特别留意垃圾邮…

三角函数在js中的应用与二维空间绕另一个点旋转计算应用

开发中遇到一个问题&#xff0c;二维空间里正方形&#xff0c;按p点旋转90度后的点A2点的坐标是多少&#xff0c;这个设计到三角函数和矩阵的运算下面有公式。 由此翻了一遍三角函数相关的知识&#xff1a; A点绕p点旋转90度得A2点的坐标是多少&#xff0c;用三角函数解答&…

Java开发 - 不知道算不算详细的JUC详解

前言 大概有快两周没有发文了&#xff0c;这段时间不断的充实自己&#xff0c;算算时间&#xff0c;也到了该收获的时候&#xff0c;今天带来一篇JUC详解&#xff0c;但说实话&#xff0c;我也不敢自信它详不详细。JUC说白了就是多线程&#xff0c;学Java不久的人知道多线程&a…

openSUSE----openSUSE常用的软件包管理命令

【原文链接】openSUSE----openSUSE常用的软件包管理命令 zypper 是openSUSE操作系统软件包管理命令 repos源管理常用命令 zypper repos (或zypper lr&#xff09; 列出所有定义的安装源zypper addrepo &#xff08;或zypper ar) 添加一个新的安装源zypper removerepo (或zyp…

Java JDK下载安装环境变量配置

目录 一、下载安装 1.简介 2.JDK下载JDK 官网海外历史地址&#xff1a; 3.安装 二、环境变量配置 1.新建JAVA_HOME变量 2.PATH变量 3.CLASSPATH 变量 4.测试是否安装成功 一、下载安装 1.简介 JDK 是SUN公司提供的一套Java 语言的软件开发工具包&#xff0c;简称JDK(JavaDevelo…

hvv培训的流量分析题

题目如下 1 找扫描器的特征 常见的扫描器 使用过滤语句http contains "acunetix" 2 要找到黑客的登录后台 我们可以考虑搜搜看常见的后台路径admin ip.src 192.168.94.59 && http contains "admin" 追踪下tcp流,302说明大概就是对的 3 h…

python基础实战5-python基本结构

1 if语句 if语句是用来进行判断的&#xff0c;其使用格式如下 if 要判断的条件&#xff1a; 条件成立时&#xff0c;要做的事情 案例一&#xff1a; age 30 print("------if判断开始------") if age > 18:print("我成年了") print("------if判断…

从零基础到网络安全专家:全网最全的网络安全学习路线

前言 网络安全知识体系非常广泛&#xff0c;涉及的领域也非常复杂&#xff0c;有时候即使有想法和热情&#xff0c;也不知道从何入手。 为了帮助那些想要进入网络安全行业的小伙伴们更快、更系统地学习网络安全知识&#xff0c;我制定了这份学习路线。本路线覆盖了网络安全的…

【C++】程序员必备知识:认识类与对象

【C】程序员必备知识&#xff1a;认识类与对象 ①.面向过程和面向对象②.类的引入③.类的定义Ⅰ.定义方式Ⅱ.命名规则建议&#xff1a; ④.类的访问限定符及封装Ⅰ.访问限定符Ⅱ.封装 ⑤.类的作用域⑥.类的实例化⑦.类的对象大小计算Ⅰ.如何计算&#xff1f;Ⅱ.类对象存储方式Ⅲ…

【物联网】初步认识了解MQTT

目录 一、MQTT是什么 二、MQTT的版本 两者之间的关系&#xff1a; ​编辑三、MQTT工作的基本原理 3.1、概念 MQTT客户端&#xff1a; MQTT服务端&#xff1a; MQTT主题&#xff1a; 以下面这个图为例进行解释&#xff1a; 3.2、MQTT订阅/发布主题的特点 相互可独立性…

【2023年五一数学建模竞赛C题】“双碳”目标下低碳建筑研究--完整思路和代码

1.问题背景与描述 赛题评析&#xff1a;这道题其实主要还是考察学生搜集资料的能力&#xff0c;可发挥空间大&#xff0c;适合小白快速上手 2.解题思路分析 2.1 问题一的分析 1.空调性能系数 2.热导系数 热导系数是指物质导热的能力&#xff0c;通常用单位时间内单位面积…

从STM32F407到AT32F407(一)

雅特力公司的MCU有着性能超群&#xff0c;价格优越的巨大优势&#xff0c;缺点是相关资料少一些&#xff0c;我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板&#xff0c;使用原子 stm32f407的开发板自带程序&#xff0c;测试串口程序&#xff0c;原设定…

【网络安全】文件包含漏洞总结

目录&#xff1a; 介绍文件包含漏洞分类 LFIRFIPHP 的文件包含函数漏洞示例代码利用任意文件读取 使用 PHP 封装协议 php://filterphp://inputRFI getshellLFI文件上传 getshellLFI日志文件 getshellLFI/proc/self/environgetshellLFIphpinfo getshellLFIsession getshell绕过…

数据结构——队列的构建

在本次博客当中我们来学习一下队列的构建。首先来介绍一下队列。队列也是一种被限制的线性表。队列要求我们其中的元素只可以从队尾进入从队头出数据。也就是说我们先进入队列的数据就会先出队列。所以我们可以将我们的两种线性表改编成为我们的队列。话题又回到了我们两种线性…