泷羽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
执行后再查询就没有此变量