ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【网络安全】Shell 脚本学习 [打印本页]

作者: 用户云卷云舒    时间: 2024-11-27 12:07
标题: 【网络安全】Shell 脚本学习
声明:学习视频来自 b 站 up 主 泷羽 sec,如涉及侵权马上删除文章
声明:本文主要用作技术分享,全部内容仅供参考。任何使用或依靠于本文信息所造成的法律后果均与本人无关。请读者自行判定风险,并遵循相关法律法规。
脚本创建执行与变量使用

起首进入Linux终端【Windows系统可以使用MobaXterm中的zsh/bash终端】,可以使用 vim 创建一个 .sh 结尾的文件。
在文件的第一行写入下列三种中的其中一种,这些是脚本解释器
  1. #!/bin/bash
  2. #!/bin/dash
  3. #!/bin/sh
复制代码
如果终端安装了 zsh 等其他脚本解释器,可以使用 #!/bin/zsh 来进行解释,或者 依然也可以使用 #!/bin/bash 等,此时执行时,依然会使用 bash 进行脚本解释,zsh 只会充当一个调用的角色。
在执行 .sh 结尾的shell 脚本时,有两种方式:
变量

声明变量 name="d1"
使用变量 echo $name / echo "my name is $name"
如果使用双引号和不使用双引号的结果是一样的,都会将变量进行更换为变量值;
但如果是单引号,就不会对变量进行解析。
变量拼接

echo "my name is $name,and my age is $ageyears old"
上述例子中,变量age和字符串years之间没有空格,由于会导致解析为空,由于没有定义变量,办理办法是 使用 双引号 或 大括号 将变量引起来
echo "my name is $name,and my age is "$age"years old"
echo "my name is $name,and my age is {$age}years old"
但是使用花括号引起来的方式,在输出时,变量内容会被显示在花括号中
以上所述变量均为暂时变量,变量由数字、字母和下划线组成,但不能以数字开头,也不能中间存在空格,可以使用下划线代替。
检察定义的变量

如果在终端直接定义变量,那么必要检察定义的变量时,可以使用
set | grep name
删除变量
unset name
永久环境变量和字符串显位

Windows中的环境变量在 path 下添加
which ls 在Linux下检察ls下令地点位置
echo $PATH Linux输出环境变量
检察输出结果存在/usr/bin目录什么意思呢就是当我们执行ls它会帮我们找到对应得目录做一个执行,也就是ls的完整路径应该是/usr/bin/ls脚本
根据上述描述,我们可以直接将我们的脚本添加至环境变量使其可以直接执行:
永久变量

修改用户设置文件(~/.bashrc 或 ~/.bash_profile)
- 对于 bash 用户,通常可以在用户主目录下的 ~/.bashrc 或 ~/.bash_profile 文件中添加目录到环境变量。如果使用的是 zsh,则是 ~/.zshrc。以 bash 为例,使用文本编辑器(如 vi 或 nano)打开 ~/.bashrc 文件。
  1. vi ~/.bashrc
复制代码
  1. export PATH=$PATH:/home/user/permanent_bin
复制代码
  1. vi /etc/profile
复制代码
  1. export PATH=$PATH:/systemwide/bin
复制代码
字符串相关操作

假设我们想知道一个字符串的长度,比如我们想解析一个字符串的长度我们如何进行实现?
比如 name="D1" age=27 然后我们通过 echo "my name is $name,and i am $age years old"  打印完整字符串
  1. str="hello world"
  2. echo ${#str}
  3. 输出字符串 str 的长度
  4. echo ${str:0:3}
  5. 输出前三个字符
复制代码
脚本参数传递与数学运算

向脚本步伐传递参数如何实现?
  1. echo 执行的文件名是:$0
  2. echo 第一个参数是:$1
  3. echo 传递的参数作为一个字符串显示:$*
  4. echo 传递的参数独立作为每个字符串显示:$@
  5. echo 传递到脚本的参数个数是:$#
  6. echo 最后命令的退出状态:$?
  7. echo 脚本运行的当前进程ID是:$$
复制代码
将上述内容添加到 2.sh 脚本中
执行脚本时, ./2.sh 1 2 这样,2.sh是第一个参数,但不是传入的第一个参数,因此 $0 就是 2.sh ,1 是传入的第一个参数,因此 $1 就是 1。
由此得出 参数传递一般为 $n(n表示数字 可递增) ,$* 就是将参数当作统一的字符串显示出来,而 $@ 是将每个字符串当作独立的字符串显示这也是 $* 和 $@ 的区别,$# 代表参数的个数,$? 是检察下令执行状态的,如果显示为0那么下令就是正常执行的,其他数字就是出错了,$$ 就是检察脚本当前进程id的。
在shell中进行数学运算

在shell编程中,利用expr进行运算
expr 5+10  回显 5+10
而 expr 5 + 10 这样写就行了5(空格)+(空格)10
以上方法实用于加法减法,如果用乘法就会报错。
expr 6\*6 (乘法是用\*  python直接使用 * 就行了,而shell要用\进行转义)
除法:
expr 6 / 3  / 是取整数
expr 6 % 3 % 是取余
混合运算
expr ( 5 + 7 ) \* 2 这样会报错,括号依然必要转义 expr \( 5 + 7 \) \* 2
通过变量进行运算

必要将变量内容赋值为运算表达式,使用反引号,这样在调用时,就可以直接得到运算结果。
脚本与用户交互以及 if 条件判定

使用shell脚本进行交互

利用read name age指定变量信息xiaoyu 26 ,然后利用echo $name  和 echo $age 来吸收用户输入。
利用read -p "请输入您的姓名" name age
输入:xiaoyu 80 【这种方式输入时,必要用空格将两个变量分开,且一次性输入】
echo $name(吸收用户的输入)
-p 用于输出后面的内容
-t 用于指定用户输入的变乱,超时自动退出
-n 用于限制用户输入内容的长度
关系运算符

起首定义两个变量,然后通过if条件判定来进行两个变量直接的判定,只能对数值进行判定,无法对字符进行判定。
  1. -eq 相等
  2. -lt 小于
  3. -gt 大于
  4. -ne 不等于
  5. else 反转
复制代码
  1. num1 = 28
  2. num2 = 36
  3. if [ "$num1" -eq "$num2" ] ;then
  4.         echo 相等
  5. else
  6.         echo 不相等
  7. fi
复制代码
字符串运算和逻辑运算符

字符串运算

注意方括号后的空格,以及分号后面的空格,还有变量的引号
  1. str1="hello"
  2. str2="hello"
  3. if [ "$str1" = "$str2" ]; then
  4.         echo True
  5. else
  6.         echo False
  7. fi
复制代码
注意:Linux巨细写敏感
  1. str1="hello"
  2. str2="hello"
  3. if [ -z "$str1" ]; then
  4.         echo True
  5. else
  6.         echo False
  7. fi
复制代码
-z 参数,用于检查变量长度是否为零
-n 参数,检查变量长度是否不为零,与-t相反
  1. str1="hello"
  2. str2="hello"
  3. if [ "$str1" ]; then
  4.         echo True
  5. else
  6.         echo False
  7. fi
复制代码
不设置任何参数,如果 str1为空,则返回 False,不为空,返回True。
逻辑运算

布尔运算
  1. num1=9
  2. if [ "$str1" != "9" ]; then
  3.         echo num1不等于9
  4. else
  5.         echo num1等于9
  6. fi
复制代码
余运算
  1. num1=9
  2. num2=19
  3. if [ "$str1" != "9" -a $num2 -lt "20" ]; then
  4.         echo True
  5. else
  6.         echo False       
  7. fi
复制代码
同时满足 $num1 != 9 -a $num2 -it 20 输出true,不满足返回false
与之相反的参数是-o参数,只必要满足其中一个就可以返回true两个都不满足就返回flase
if 条件判定与 for 循环结构

if 条件判定
  1. #!/bin/bash
  2. # 定义变量
  3. a=10
  4. b=20
  5. # 进行条件判断
  6. if [ "$a" -eq "$b" ]; then
  7.         echo "a=b"
  8. elif [ "$a" -gt "$b" ]; then
  9.         echo "a>b"
  10. else
  11.         echo "没有符合上述条件"
  12. fi
复制代码
bash 脚本中,通过 “变量名=值” 的方式就可以完成变量的定义和赋值。
for 循环
  1. for num in 1 2 3 4 5
  2. do
  3.         echo "The number is $num"
  4. done
复制代码
这是一段使用for循环的代码片段,常见于Shell脚本(如bash脚本)中,用于对一系列的值进行迭代操作。
循环语句 for num in 1 2 3 4 5  :
for:是循环的关键字,用于开启一个for循环结构。
num:定义了一个循环变量,在每次循环迭代过程中,这个变量会被赋予差别的值。
in 1 2 3 4 5 :指定了个值的列表,循环变量。num将会依次取这个列表中的每一个值,num会先被赋值为1,然后进行第一次循环;接着num会被赋值为2,进行第二次循环,以此类推,
直到num取完列表中的末了一个值5。
循环体
do:是与for循环起始语句配合使用的关键字,它标志着循环体的开始。在do和后面的done之间的语句就是每次循环时必要执行的操作。
输出语句 echo "The number is Snum":
echo:是一个用于在终端输出信息的下令。
循环竣事
done:是for循环的竣事关键字,它标志着整个for循环过程竣事。
  1. for str in "hello world"
  2. do
  3.         echo $str
  4. done
复制代码
上述循环中,str 只会被赋值一次,其赋值为字符串,由于值列表中只有一个字符串。
for循环与while循环
  1. for i in `seq 1 100`
  2. do
  3.         echo $i
  4. done
复制代码
  1. for i in $(seq 1 100)
  2. do
  3.         echo $i
  4. done
复制代码
上述两种写法的作用都是一样的,使 i 从1取值到100,并输出。
  1. for ((i=1; i<100; i++))
  2. do
  3.         echo $i
  4. done
复制代码
输入重定向
dist.txt
  1. i=1
  2. while (( $i<=10 ))
  3. do
  4.         echo $i
  5.         ((i++))
  6. done
复制代码
使用 ls 下令加输入重定向,检察目录下的文件
  1. i=1
  2. while (( $i<=10 ))
  3. do
  4.         echo $i
  5.         let "i++"
  6. done
复制代码
文件描述符

0:尺度输入
1:尺度输出
2:错误输出
例子:
  1. i=0 # 初始化变量
  2. until [ ! $i -lt 10 ]
  3. do
  4.         echo $i
  5.         ((i++))
  6. done
复制代码
如果输出正确,就会将结果输出到3.txt,如果错误,就将结果输出到5.txt

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4