泷羽sec-----shell脚本编程(1-3)

变量的定义与使用

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

1. 创建shell脚本

以下的脚本编写都是基于kali也就是Debian操作系统

首先知道一点,shell脚本是以.sh结尾的可执行文件,可通过touchvim等命令创建一个脚本文件

image

然后在1.sh文件中编写一个输出的语句

image

2. shell脚本的编写

2.1 脚本解释器

在进行shell脚本编写时,首先第一行内容,就是指定该脚本使用哪种脚本解释器,常见的有三种

  1. #! /bin/bash
  2. #! /bin/sh
  3. #! /bin/dash

一般sh是很古老的了,一般使用sh其实都是在调用其他的解释器,如在kali中的sh就是指向dash的一个链接

也有的脚本不管开头的指向脚本解释器,最终都是由dash进行解释

image

2.2 变量的声明和定义

对于变量名称的定义

变量名可以由字母、数字和下划线组成,但不能以数字开头。也就是基本和python中定义一样,不需要和其他语言(如c)中定义变量时,需要在变量的名称前加上int等数据类型,才算定义一个变量

对于变量的调用或使用的定义

定义好的变量,需要使用时,需要在变量名称前加上$,表示调用或使用该变量

单引号与双引号的区别

在下面的使用3中可以知道,字符串是用"双引号圈住的

这里使用'单引号测试,发现对于定义的变量name调用时,不会把变量的值显示,而是把$name作为字符输出了

image

所有,如果想要在字符串中可以执行变量并使用其值,就需要把字符串使用双引号圈住。

而对于双引号中有单引号并不会影响变量的调用。可参考使用3,我在字符串中设置了I'm

使用1

先定义,然后再执行,需要两条语句

image

使用2

定义执行,一条命令。;用于隔开,表示一行代码的结束。&&是逻辑运算符,也就是前面变量定义成功后,执行后面的命令

image

使用3

在一段字符串中穿插使用变量,这里就是字符串中有name但是注意,字符串中的name就会显示为name,而字符串中的$name,会显示为定义的值

image

使用4

对于未定义的变量直接调用或使用,会直接显示为空,也就是不显示

如,这里并未定义go,但是可以看到调用时,无任何显示

image

使用5

对于变量与字符连在一起,这时候可以选择空格隔开,或者使用"双引号,把变量名单独圈住,也是可以调用变量

image

或者使用{}花括号把变量括起来,也是可以达到输出变量值的效果

image

使用6

set命令是一个内建的 shell 命令,主要用于设置和显示 shell 环境变量和函数。它可以修改 shell 的运行环境,包括变量的赋值、控制 shell 的行为选项等。单独使用set命令(不带参数)会显示所有已定义的 shell 变量和函数

image

这里看到显示的太多了,那么怎么显示我们想要的呢,可以使用| 搭配grep

|是管道符。它的主要作用是将一个命令的输出作为另一个命令的输入,从而实现多个命令的组合使用,以完成更复杂的任务

grep是一个强大的文本搜索工具。它用于在文本文件(或标准输入)中查找包含指定模式的行,并将这些行输出。这种模式可以是简单的字符串,也可以是复杂的正则表达式。这里因为刚开始,不搞复杂的,只搜索简单的字符即可

使用命令set | grep name即查询已定义的变量或函数中含有name字符的

image

image

unset是一个内建的命令,主要用于删除变量或函数

这里删除变量name,再去查找会发现已经没有了

image

3. shell脚本的执行

正如在1目录中提到了,刚创建的sh脚本是没有执行权限的

因为在linux操作系统中,由umask值控制刚创建的所有文件权限,对于umask的值计算,可自行百度,因为一般也很少有人会把umask的值设置成新创建的文件具有执行权限。作为了解即可

如果所有新创建的文件都具有执行权限,那么可能会带来安全风险

方法1

给文件加权限,使用chmod命令

image

方法2

使用bashshdash命令来执行脚本文件

因为bashsh是具有执行权限的程序,它们被允许读取和处理文件。当你使用bashsh来运行脚本时,就相当于你把脚本文件的内容作为输入传递给了这些 shell 程序。

image

方法3

source命令(在bash中也可以写成.)是一个内建命令,它的主要作用是在当前 shell 环境中读取并执行文件中的命令。与直接执行脚本文件(通过给文件添加执行权限并运行)不同,source命令是将脚本中的命令融入到当前的 shell 进程中。这种方式并不涉及到文件系统对文件执行权限的检查,因为它是基于当前shell的权限和功能来操作的。

一般用于配置文件的加载方面

为测试与方法2有何不同,在1.sh文件中加入命令ls -l,以长格式显示当前目录下的信息

可以看到,source执行的脚本文件中的命令时,作为1.sh中的命令ls -l的显示,与直接使用命令ls -l是一样的

image

永久环境变量

前言

如前所说,都是临时变量,那么什么是永久变量呢,首先要知道环境变量这一词语。

在windows中,计算机设置中有环境变量这一项,我们平时在终端使用一些命令时,为什么没有指定目录或者不在其目录下的情况时,可以直接使用命令呢,就是因为环境变量。$PATH

诚然在linux系统中也是一样的道理,前面创建的脚本都需要指定目录然后执行,那么如何把脚本假如到环境变量中,使得该脚本也可以像命令一样直接使用。

方法1 移动

首先在linux系统中查看环境变量的目录,这些目录下的一些脚本,不需要指定目录,不管在哪个目录下,只要输入命令,就会调取这些目录下的脚本去执行

echo $PATH

image

如:ls,查看其目录which ls

然后发现目录/usr/bin在环境变量中,那么在使用ls时,相当于/usr/bin/ls执行了

image

然后把自己创建的脚本移动到这个目录下/usr/bin,或者其他环境变量中。这时候就可以直接使用脚本文件的名称,就会执行脚本文件中的代码

这里需要注意,如果是新建的sh文件,需要给予可执行权限,不然即使移动到环境变量中,也是不能直接使用的

image

方法2 添加

知道环境变量了,并且脚本文件并没有移动到环境变量的目录下的时候,可以把脚本问价所在目录添加到环境变量中,使用export指令

export PATH=/root:$PATH		//必须大写

export是用于设置环境变量的关键字,使用设置的变量可以在当前shell以及由该shell启动的子进程中生效

PATH环境变量,定义了系统在哪些目录下去寻找可执行程序,如当执行ls时,会根据其所指的目录下去寻找对应的可执行文件,然后执行

/root:PATH重新定义PATH的值,将/root目录添加到原有的PATH变量值的最前面(假设原有的PATH值存储在变量PATH中,这里通过:PATH的形式保留原本的值,并添加新的部分),这样的结果是,当系统去查找可执行程序时,会先在/root目录下查找,然后再按照原来的PATH所指定的其他目录顺序查找

新建一个test.sh文件,并给予可执行权限

image

image

使用export只是设置了临时变量,当命令行(终端)关闭后,就会失效的,可通过把该代码写入到配置文件中(.bashrc)才能永久生效,然后使用source .bashrc命令,使得该文件生效(或者重启)

vi /.bashrc

image

甚至可以输出环境变量,可以看到并没有该目录,但是可以直接使用,因为是写入文件的,所以是永久环境变量并且可直接执行

image

字符串的相关操作

str="hello"			//=与变量名中间不要空格
echo ${#str}		//输出变量str的字符串长度

echo ${str:0:3}		//截取字符串str,从下标0开始,截取3个字符
如果${str:1:1}//表示截取下标为1的一个字符
${str:2:1}//表示截取下标为2的一个字符

image

脚本参数传递

echo 文件名为					   $0
echo 第一个传参是 			   	  $1
echo 传递的参数作为一个字符串显示   	 $*
echo 传递的参数独立作为每个字符串显示 	$@
echo 传递到脚本的参数个数是		   $#
echo 最后命令的退出状态				$?
echo 脚本运行的当前进程ID 			$$


如文件名为1.sh

其中$1是第一个,第二个就可以是$2,那么就可以是$3....$n
sh 1.sh name		就会显示第一个参数为name

$* 就是将参数当作统一的字符串显示出
$@ 将每个字符串当作独立的字符串显示
$? 为0,表示运行正常,其他数字,则出错
$$ 脚本运行的当前进程ID

编写test.sh文件,并传参,看输出结果

image

image

数学运算

利用expr进行数学运算 (运算符前后有空格的)

加减法

expr 1 + 2

image

乘法

expr 2 \* 2,因为*需要转义

image

除法

expr 6 / 3

image

取模

expr 5 / 3

image

对于加减乘除混合的

expr 3 + 7 \* 10

image

需要先计算加减的,使用()进行处理,而且,()需要转义,前后也有空格

expr \(3 + 7\) \* 10

image

通过变量赋值,使用$

num = $(expr 5 \* 10)

echo $name

image

当然还有((....))的形式,let命令

如:

((name = 5 * 10))
或者
let "name = 5 * 10"

echo $name
posted @   whitehe  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示