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

泷羽sec-shell脚本(1)脚本创建执行与变量使用 学习笔记

 声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频)

本章课程链接:shell脚本(1)脚本创建执行与变量使用_哔哩哔哩_bilibili

Shell

       Shell 脚本是一种为 Linux/Unix 操作系统的 shell(命令行解释器)编写的脚本程序。它是一系列命令的集合,通过 shell 来执行。就像是一个批处理文件,将多个需要在命令行中手动输入的命令组合在一起,实现自动化任务处理。

用途

1.自动化任务:

系统管理任务是 Shell 脚本的常见应用场景。比如可以编写一个脚本用于自动更新系统软件包。在 Debian 或 Ubuntu 系统中,更新软件包通常需要在命令行输入sudo apt - get update和sudo apt - get upgrade这两个命令。通过 Shell 脚本可以将这两个命令组合起来,还可以添加一些条件判断,如检查网络连接是否正常后再执行更新。

2.文件处理:

可以用于批量处理文件。例如,有一个目录下有很多文本文件,需要将它们的内容全部合并到一个新文件中。可以使用 Shell 脚本通过循环遍历文件目录中的每个文件,读取文件内容并写入到新文件,从而高效地完成文件合并任务。

3.配置管理:

在服务器环境中,配置管理很重要。Shell 脚本可以用于配置软件环境。例如,在安装和配置 Web 服务器(如 Apache)时,通过 Shell 脚本可以自动完成软件的下载、解压、配置文件的修改以及服务的启动等一系列操作。

一、Shell脚本

1、创建脚本

首先建立一个脚本文件

vim 1.sh  

可以利用 #! /bin/bash、#! /bin/dash、#! /bin/sh 这三种其实不管用哪种脚本解释器最后调用的还是这个dash

比如ls -l bin/sh 发现调用的还是dash

1.[#! /bin/bash]

含义
#!在脚本语言中被称为 “Shebang”(也称为 “Hashbang”)。#! /bin/bash这一行通常是一个 Shell 脚本文件的第一行内容。它的作用是告诉操作系统这个脚本应该使用/bin/bash这个 Bash 解释器来执行其中的命令。
具体解释
#!部分:
这是一个特殊的标记,用于指示脚本的解释方式。当操作系统看到这个标记时,它会知道接下来的内容是一个脚本,并且需要找到合适的程序来解释执行这个脚本。
/bin/bash部分:
这是 Bash 解释器的路径。/bin是一个常见的系统目录,其中存放着许多基本的可执行文件和命令,bash就是其中之一。Bash 是一种功能强大的 Unix shell,它能够解释和执行脚本中的各种命令,包括变量定义、条件判断、循环以及调用其他程序等操作。

2. [#! /bin/dash]

含义
#! /bin/dash是 Shell 脚本文件开头的一个特殊声明,类似于#! /bin/bash。它表示这个脚本应该使用/bin/dash这个 Dash 解释器来执行。
与 Bash 的区别及适用场景
语法兼容性:
Dash 严格遵循 POSIX 标准,语法较为精简。相比 Bash,Dash 缺少一些 Bash 特有的扩展功能和语法糖。例如,Dash 没有 Bash 中的数组变量的某些高级操作,如${array[@]}这种复杂的数组引用方式。如果你的脚本主要使用 POSIX 标准的命令和语法,使用 Dash 可以保证良好的兼容性和高效的执行。
性能方面:
Dash 通常启动更快,占用的系统资源相对较少。在一些对性能要求较高、资源较为紧张的场景下更具优势。比如在系统启动脚本中,许多 Linux 发行版(如 Ubuntu)会使用 Dash 来执行/etc/init.d目录下的脚本。这是因为在系统启动阶段,快速地执行一系列初始化任务是关键,而 Dash 的轻量级特性可以满足这一需求。
脚本可移植性:
由于 Dash 遵循 POSIX 标准,以#! /bin/dash开头的脚本在其他遵循 POSIX 标准的 Unix - like 系统上可能更容易移植。只要目标系统中有 Dash 或者兼容 Dash 的解释器,脚本就有更大的机会正确执行,而不需要对脚本进行大量修改。

3.[#! /bin/sh]

含义
#! /bin/sh是 Shell 脚本文件头部的一个特殊指令。#!是所谓的 “shebang”(也叫 “hashbang”),用于告诉操作系统这个文件是一个脚本,并且应该使用/bin/sh这个命令解释器来运行脚本中的内容。
其中,/bin/sh在大多数 Linux 系统中通常是指向某种具体的 Shell 解释器。在很多情况下,它可能是指向 Bash(/bin/bash)或者 Dash(/bin/dash)等,这取决于系统的配置和发行版的选择。
 

Dash: 是 Debian Almquist Shell 的缩写,它是一种 Unix shell,是基于 Almquist Shell(sh)开发而来的。在 Linux 系统环境中,它是一种命令行解释器,用于解释和执行用户在终端输入的命令。

Bash(Bourne - Again Shell)是 Linux 系统中另一种非常流行的 shell。Bash 功能强大,它有很多高级特性,如命令行编辑、自动补全、历史记录功能以及丰富的编程结构(如数组等复杂数据结构)。相比之下,Dash 更加精简。例如,Dash 没有 Bash 中一些用于交互环境的高级特性,但在执行简单的脚本时,Dash 可能会更快。

这三种无论是哪一种脚本解释器,最终调用的还是dash

2、Shell文件命令

        2.1文本处理命令

2.1.1 grep

功能:用于在文件中搜索指定的字符串,并打印包含该字符串的行。
示例:
grep "error" log.txt:在log.txt文件中搜索包含 “error” 字符串的行,并将这些行打印出来。

grep "aaa" 1.txt

搜索1.txt中aaa的值:

1txt中的内容

shell脚本

运行结果

grep -r "keyword" directory/:递归地在directory/及其子目录下的所有文件中搜索包含 “keyword” 的行。

2.1.2 sed

功能:用于对文件内容进行编辑,如替换、删除、插入等操作。
示例:
sed's/old_text/new_text/g' file.txt:将file.txt文件中的所有 “old_text” 替换为 “new_text”。其中g表示全局替换,如果没有g,则只替换每行中的第一个匹配项。

sed 's/aaa/bbb/g' 1.txt


sed '1d' file.txt:删除file.txt文件的第一行。

2.1.3awk

功能:用于处理文本文件,它可以对文件中的每一行进行分割、比较、计算等操作。
示例:
awk '{print $1}' file.txt:打印file.txt文件中每一行的第一个字段。默认情况下,awk以空格或制表符作为字段分隔符。

awk '{print $1}' 1.txt

awk -F',' '{print $2}' data.csv:如果data.csv是逗号分隔的文件,-F','选项用于指定逗号为字段分隔符,此命令会打印文件中每一行的第二个字段。
进程管理命令

2.2进程管理命令

2.2.1 ps

功能:用于查看当前系统中的进程状态。
示例:
ps -ef:显示所有进程的详细信息,包括进程的用户、PID(进程 ID)、父进程 ID、启动时间、终端等信息。

ps -ef


ps -aux:类似于ps -ef,不过输出格式略有不同,它也会显示进程占用的 CPU 和内存等资源的使用情况。

2.2.2 kill

功能:用于终止指定的进程。
示例:
kill PID:其中PID是要终止的进程的进程 ID。例如kill 1234会终止进程 ID 为 1234 的进程。
kill -9 PID:强制终止进程。有时候普通的kill命令可能无法终止某些进程,使用kill -9可以更强制地终止进程,但这种方式可能会导致进程没有机会进行清理操作,可能会丢失数据,所以要谨慎使用

2.3 系统信息查看命令

2.3.1 uname

功能:用于获取系统的相关信息。
示例:
uname -a:显示系统的所有信息,包括内核名称、主机名、内核版本、硬件平台等信息。例如uname -a可能输出类似于Linux server.example.com 5.4.0 - 12 - generic #19 - Ubuntu SMP Wed Dec 23 14:06:04 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux的内容。

2.3.2 df

功能:用于查看文件系统的磁盘空间使用情况。
示例:
df -h:以人类可读的格式(如 KB、MB、GB 等)显示磁盘空间使用情况。例如df -h会显示每个挂载点的文件系统总大小、已使用大小、可用大小、使用率等信息。

2.3.3 free

功能:用于查看系统内存的使用情况。
示例:
free -m:以 MB 为单位显示内存的使用情况,包括总内存、已使用内存、空闲内存、缓存等信息。这有助于了解系统内存资源是否紧张。

3、运行Shell命令

./1.sh

权限不足

查看权限:

 ls -l 1.sh  

发现缺少执行权限:

“rw-”:这是文件所有者的权限。“r” 表示有读取(read)权限,“w” 表示有写入(write)权限,这里的 “-” 表示没有可执行(execute)权限。所以文件所有者对该文件有读和写的权限,但不能执行它。
“r--”:这是所属组的权限。表示所属组的成员对该文件只有读取权限,没有写入和执行权限。
“r--”:这是其他用户的权限。同样意味着其他用户对该文件也只有读取权限,没有写入和执行权限。

解决方法:

3.1 chmod 加权
chmod +x -R 1.sh

3.2 sh 运行

sh 1.sh

3.3 source

与sh很像,但是颜色会加深

source 2.sh

对比效果:

二、shell 变量

变量:是计算机编程中的一个基本概念。在 Shell 脚本(以及其他编程语言)中,变量就像是一个容器,用于存储数据。这个数据可以是数字、字符串、数组等各种类型的值。例如,你可以把一个人的名字存储在一个变量中,或者把一个文件的路径存储在另一个变量中。
变量有一个名称,通过这个名称可以访问和操作变量中存储的值。就好像每个变量是一个有标签的盒子,标签是变量名,盒子里装的东西就是变量的值。

在 Shell 脚本中,定义变量的方式很简单,变量名不需要提前声明,直接赋值即可。变量名和值之间用 “=” 连接,并且赋值时 “=” 两边不能有空格。例如:
name="A":定义了一个名为name的变量,并将其赋值为 “A”。
可以同时定义多个变量,如:
AA="A"; BB="B":定义了AA和BB两个变量,分别赋值为 “A” 和 “B”。

1.定义变量并输出

首先声明一个变量name,他的值是xiaoyu

name=“xiaoyu”

输出此变量

echo $name 

再比如

age=“27”
echo $age 

在 Shell(如 Bash、Zsh 等)环境中,$是一个特殊的字符,用于引用变量的值。当你使用$name这种形式时,name被视为一个变量名,$符号告诉 Shell 去获取名为name的变量中存储的值

除了简单的变量引用,$还可以用于更复杂的表达式。例如,${name}_suffix这种形式可以对变量name进行引用,并在其后面添加一个固定的字符串suffix

2进阶一下

echo my name is $name,and my age is $age years old

就可以得到

引号:

1.单引号(' ')

特点:
单引号中的内容会被原样输出,Shell 不会对单引号内的变量进行替换,也不会对其中的特殊字符(如$、\等)进行解释。
示例:


对于特殊字符,比如echo '$(date)',输出结果是$(date),而不是执行date命令后的日期时间,因为单引号阻止了命令替换。

双引号(" ")

特点:
双引号中的变量会被替换为变量的值,并且会对部分特殊字符进行解释。例如,\n会被解释为换行符,\t会被解释为制表符等。但是双引号中的命令替换(如$(command))和算术扩展(如$((expression)))仍然会被执行。

单引号里面的字符视为普通字符,双引号不会或不加引号不会

3.变量拼接

在某些场合下我们想要将变量和字符连接起来

如上,想要实现

my name is“xiaoyu”,and my age is“27”years old

需要为了解决这个问题,问题我们可以使用 双引号" 或者 花括号{}拼接起来

echo my name is $name,and my age is "$age"years old
echo my name is $name,and my age is {$age}years old

上面全部是临时的一个变量变量是由数字,字符串下划线组成,但是不能以数字开头例如9name 这种是不行的,变量中间最好不要有空格,比如 long  yu 如果非要用这种可以加个下划线ong_yu="xiaoyu”这种

查看变量:

1.使用echo命令

echo $变量名

2.使用set命令

set

执行set命令后,会显示当前 Shell 会话中定义的所有变量(包括用户自定义变量、环境变量和一些特殊变量,如位置参数变量等)。输出内容可能会比较多,例如会显示变量名和其对应的值,像my_var='Hello'这样的形式,同时还会列出像BASH_VERSION等环境变量和1(如果有命令行参数,第一个参数的值)等位置参数变量。

所以可以使用

set | grep name

就可以显示出关于name的变量

删除变量:

unset name

执行后再查询就没有此变量


http://www.kler.cn/a/414726.html

相关文章:

  • 如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?
  • 33 基于单片机的智能窗帘控制系统
  • spring boot编写注意事项
  • 富文本编辑器图片上传并回显
  • GITEX GLOBAL聚焦AI创新,Soul App创始人张璐团队带来多模态社交新体验
  • Ubuntu20.04+ROS 进行机械臂抓取仿真:环境搭建(一)
  • 【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓
  • Linux 命令 whoami:揭秘当前用户身份
  • 派对灯 Party Lamps [USACO 2.2]
  • DVWA 在 Windows 环境下的部署指南
  • C++设计模式行为模式———状态模式
  • npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法
  • ASP.NET Core 入门
  • Linux:文件管理(二)——文件缓冲区
  • DVWA靶场——File Inclusion
  • Linux笔记--基于OCRmyPDF将扫描件PDF转换为可搜索的PDF
  • 大语言模型LLM的微调中 QA 转换的小工具 xlsx2json.py
  • C++语法·叭
  • 气膜建筑:打造全天候安全作业空间,提升工程建设效率—轻空间
  • BERT的中文问答系统46网页页面
  • Spring Boot教程之九:创建基本应用程序及Hello Word示例
  • MIG IP核详解(二)
  • 【菜笔cf刷题日常-1400】C. Johnny and Another Rating Drop(位运算,数学)
  • 【Git】Git 完全指南:从入门到精通
  • 记录QT5迁移到QT6.8上的一些问题
  • vscode配置