泷羽sec-----shell脚本编程(1-3)
变量的定义与使用
声明!
学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页B站泷羽sec
1. 创建shell脚本
以下的脚本编写都是基于kali
也就是Debian
操作系统
首先知道一点,shell
脚本是以.sh
结尾的可执行文件,可通过touch
或vim
等命令创建一个脚本文件
然后在1.sh
文件中编写一个输出的语句
2. shell脚本的编写
2.1 脚本解释器
在进行shell
脚本编写时,首先第一行内容,就是指定该脚本使用哪种脚本解释器,常见的有三种
#! /bin/bash
#! /bin/sh
#! /bin/dash
一般sh
是很古老的了,一般使用sh
其实都是在调用其他的解释器,如在kali
中的sh
就是指向dash
的一个链接
也有的脚本不管开头的指向脚本解释器,最终都是由dash
进行解释
2.2 变量的声明和定义
对于变量名称的定义
变量名可以由字母、数字和下划线组成,但不能以数字开头。也就是基本和python
中定义一样,不需要和其他语言(如c
)中定义变量时,需要在变量的名称前加上int
等数据类型,才算定义一个变量
对于变量的调用或使用的定义
定义好的变量,需要使用时,需要在变量名称前加上$
,表示调用或使用该变量
单引号与双引号的区别
在下面的使用3中可以知道,字符串是用"
双引号圈住的
这里使用'
单引号测试,发现对于定义的变量name
调用时,不会把变量的值显示,而是把$name
作为字符输出了
所有,如果想要在字符串中可以执行变量并使用其值,就需要把字符串使用双引号圈住。
而对于双引号中有单引号并不会影响变量的调用。可参考使用3,我在字符串中设置了I'm
。
使用1
先定义,然后再执行,需要两条语句
使用2
定义执行,一条命令。;
用于隔开,表示一行代码的结束。&&
是逻辑运算符,也就是前面变量定义成功后,执行后面的命令
使用3
在一段字符串中穿插使用变量,这里就是字符串中有name
但是注意,字符串中的name
就会显示为name
,而字符串中的$name
,会显示为定义的值
使用4
对于未定义的变量直接调用或使用,会直接显示为空,也就是不显示
如,这里并未定义go
,但是可以看到调用时,无任何显示
使用5
对于变量与字符连在一起,这时候可以选择空格隔开,或者使用"
双引号,把变量名单独圈住,也是可以调用变量
或者使用{}
花括号把变量括起来,也是可以达到输出变量值的效果
使用6
set
命令是一个内建的 shell 命令,主要用于设置和显示 shell 环境变量和函数。它可以修改 shell 的运行环境,包括变量的赋值、控制 shell 的行为选项等。单独使用set
命令(不带参数)会显示所有已定义的 shell 变量和函数
这里看到显示的太多了,那么怎么显示我们想要的呢,可以使用|
搭配grep
|
是管道符。它的主要作用是将一个命令的输出作为另一个命令的输入,从而实现多个命令的组合使用,以完成更复杂的任务
grep
是一个强大的文本搜索工具。它用于在文本文件(或标准输入)中查找包含指定模式的行,并将这些行输出。这种模式可以是简单的字符串,也可以是复杂的正则表达式。这里因为刚开始,不搞复杂的,只搜索简单的字符即可
使用命令set | grep name
即查询已定义的变量或函数中含有name
字符的
unset
是一个内建的命令,主要用于删除变量或函数
这里删除变量name
,再去查找会发现已经没有了
3. shell脚本的执行
正如在1目录中提到了,刚创建的sh
脚本是没有执行权限的
因为在linux
操作系统中,由umask
值控制刚创建的所有文件权限,对于umask
的值计算,可自行百度,因为一般也很少有人会把umask
的值设置成新创建的文件具有执行权限。作为了解即可
如果所有新创建的文件都具有执行权限,那么可能会带来安全风险
方法1
给文件加权限,使用chmod
命令
方法2
使用bash
、sh
或dash
命令来执行脚本文件
因为bash
和sh
是具有执行权限的程序,它们被允许读取和处理文件。当你使用bash
或sh
来运行脚本时,就相当于你把脚本文件的内容作为输入传递给了这些 shell
程序。
方法3
source
命令(在bash
中也可以写成.
)是一个内建命令,它的主要作用是在当前 shell 环境中读取并执行文件中的命令。与直接执行脚本文件(通过给文件添加执行权限并运行)不同,source
命令是将脚本中的命令融入到当前的 shell 进程中。这种方式并不涉及到文件系统对文件执行权限的检查,因为它是基于当前shell的权限和功能来操作的。
一般用于配置文件的加载方面
为测试与方法2有何不同,在1.sh
文件中加入命令ls -l
,以长格式显示当前目录下的信息
可以看到,source
执行的脚本文件中的命令时,作为1.sh
中的命令ls -l
的显示,与直接使用命令ls -l
是一样的
永久环境变量
前言
如前所说,都是临时变量,那么什么是永久变量呢,首先要知道环境变量这一词语。
在windows中,计算机设置中有环境变量这一项,我们平时在终端使用一些命令时,为什么没有指定目录或者不在其目录下的情况时,可以直接使用命令呢,就是因为环境变量。$PATH
。
诚然在linux系统中也是一样的道理,前面创建的脚本都需要指定目录然后执行,那么如何把脚本假如到环境变量中,使得该脚本也可以像命令一样直接使用。
方法1 移动
首先在linux系统中查看环境变量的目录,这些目录下的一些脚本,不需要指定目录,不管在哪个目录下,只要输入命令,就会调取这些目录下的脚本去执行
echo $PATH
如:ls
,查看其目录which ls
然后发现目录/usr/bin
在环境变量中,那么在使用ls
时,相当于/usr/bin/ls
执行了
然后把自己创建的脚本移动到这个目录下/usr/bin
,或者其他环境变量中。这时候就可以直接使用脚本文件的名称,就会执行脚本文件中的代码
这里需要注意,如果是新建的sh
文件,需要给予可执行权限,不然即使移动到环境变量中,也是不能直接使用的
方法2 添加
知道环境变量了,并且脚本文件并没有移动到环境变量的目录下的时候,可以把脚本问价所在目录添加到环境变量中,使用export
指令
export PATH=/root:$PATH //必须大写
export
是用于设置环境变量的关键字,使用设置的变量可以在当前shell
以及由该shell
启动的子进程中生效
PATH
环境变量,定义了系统在哪些目录下去寻找可执行程序,如当执行ls
时,会根据其所指的目录下去寻找对应的可执行文件,然后执行
/root:PATH
重新定义PATH的值,将/root
目录添加到原有的PATH
变量值的最前面(假设原有的PATH
值存储在变量PATH
中,这里通过:PATH
的形式保留原本的值,并添加新的部分),这样的结果是,当系统去查找可执行程序时,会先在/root
目录下查找,然后再按照原来的PATH
所指定的其他目录顺序查找
新建一个test.sh
文件,并给予可执行权限
使用export
只是设置了临时变量,当命令行(终端)关闭后,就会失效的,可通过把该代码写入到配置文件中(.bashrc
)才能永久生效,然后使用source .bashrc
命令,使得该文件生效(或者重启)
vi /.bashrc
甚至可以输出环境变量,可以看到并没有该目录,但是可以直接使用,因为是写入文件的,所以是永久环境变量并且可直接执行
字符串的相关操作
str="hello" //=与变量名中间不要空格
echo ${#str} //输出变量str的字符串长度
echo ${str:0:3} //截取字符串str,从下标0开始,截取3个字符
如果${str:1:1}//表示截取下标为1的一个字符
${str:2:1}//表示截取下标为2的一个字符
脚本参数传递
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
文件,并传参,看输出结果
数学运算
利用expr
进行数学运算 (运算符前后有空格的)
加减法
expr 1 + 2
乘法
expr 2 \* 2
,因为*
需要转义
除法
expr 6 / 3
取模
expr 5 / 3
对于加减乘除混合的
expr 3 + 7 \* 10
需要先计算加减的,使用()
进行处理,而且,()
需要转义,前后也有空格
expr \(3 + 7\) \* 10
通过变量赋值,使用$
num = $(expr 5 \* 10)
echo $name
当然还有((....))
的形式,let
命令
如:
((name = 5 * 10))
或者
let "name = 5 * 10"
echo $name
本文来自博客园,作者:whitehe,转载请注明原文链接:https://www.cnblogs.com/whitehe/p/18578408
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库