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

泷羽sec-星河飞雪-shell-2

免责声明

学习视频来自 B 站up主泷羽sec,如涉及侵权马上删除文章。

笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。

泷羽sec官网:https://longyusec.com/

泷羽sec B站地址:https://space.bilibili.com/350329294

泷羽sec帮会:https://wiki.freebuf.com/front/societyFront?invitation_code=5a2005d9&society_id=239&source_data=2

文章目录

    • 传递参数
    • shell运算符
      • 算数运算符
        • 常用符号
      • 关系运算符
      • 布尔运算符
      • 逻辑运算符
      • 字符串运算符
      • 文件测试运算符
      • 自增自减运算符
        • `let`
        • `$(())$`
        • `(())`

传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为 $nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。

例如可以使用 $1$2 等来引用传递给脚本的参数,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

shell运算符

算数运算符

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

add=`expr 2 + 2`
echo "两数之和为 : $add"

(注意使用的是反引号 *`* 而不是单引号 *'*)

常用符号
运算符说明示例
+加法expr $a + $b
-减法expr $a - $b
*乘法expr $a \* $b
/除法expr $b / $a
%取余expr $b % $a
=赋值a=$b 把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[$a == $b] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[$a != $b]返回 true。

在代码实现中,运用*乘法运算时,需要用到\进行转义,才能正常完整运算

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ]
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ]
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ]
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ]
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ]
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ]

布尔运算符

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ]
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ]
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ]

逻辑运算符

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]]
||逻辑的 OR`[[$a -lt 100

字符串运算符

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ]
!=检测两个字符串是否不相等,不相等返回 true。[ $a != $b ]
-z检测字符串长度是否为0,为0返回 true。[ -z $a ]
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n "$a" ]
$检测字符串是否不为空,不为空返回 true。[ $a ]

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ]
-c file检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ]
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ]
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ]
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ]
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ]
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ]
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ]
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ]
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ]
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ]
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ]
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ]

有名管道(Named Pipe),也被称为 FIFO(First In, First Out),是一种在 Unix 和类 Unix 操作系统(如 Linux)中用于进程间通信(IPC, Inter-Process Communication)的机制。与无名管道(由 shell 命令通过管道符 | 创建的临时管道)不同,有名管道可以在文件系统中以文件的形式存在,因此得名“有名管道”。

有名管道具有以下特点:

  1. 持久性:有名管道存在于文件系统中,直到显式地被删除,而无名管道仅存在于创建它们的进程的生命周期内。

  2. 双向通信:有名管道可以支持双向通信,即两个进程可以读写同一个管道。不过,在实际使用中,通常会通过创建两个有名管道来实现全双工通信,一个用于读,一个用于写。

  3. 同步:有名管道提供了一定程度的同步机制,确保数据按发送顺序被接收。

  4. 文件属性:有名管道在文件系统中表现为一种特殊类型的文件,可以通过 ls -l 命令查看其属性,文件类型显示为 p

  5. 使用限制:有名管道主要用于相关进程间的通信,且通常是在本地系统上的进程间。

在 shell 脚本中,可以使用 -p 选项与 test 命令(或其简写形式 [ ])来检查一个文件是否是有名管道。例如:

file="/path/to/named_pipe"
if [ -p "$file" ]; then
    echo "$file is a named pipe."
else
    echo "$file is not a named pipe."
fi

如果 $file 指向一个有名管道文件,上述脚本将输出 "$file is a named pipe."

创建有名管道可以使用 mkfifo 命令。例如:

mkfifo /tmp/my_named_pipe

这将在 /tmp 目录下创建一个名为 my_named_pipe 的有名管道文件。之后,不同的进程可以打开这个管道文件进行读写操作,实现进程间通信。

自增自减运算符

let
#!/bin/bash

# 初始化变量
num=5

# 自增
let num++

# 自减
let num--

echo $num
$(())$
#!/bin/bash

# 初始化变量
num=5

# 自增
num=$((num + 1))

# 自减
num=$((num - 1))

echo $num
(())
#!/bin/bash

# 初始化变量
num=5

# 自增
((num++))

# 自减
((num--))

echo $num

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

相关文章:

  • 关于msvcr120.dll丢失怎样修复的相关分享,一键修复msvcr120.dll
  • 网络安全在线网站/靶场:全面探索与实践
  • Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
  • 【深度学习之一】2024最新pytorch+cuda+cudnn下载安装搭建开发环境
  • linux下的spi开发与框架源码分析
  • FreeRTOS之vTaskDelete实现分析
  • ara::com 与 AUTOSAR 元模型的关系总结
  • java 并发编程 (1)java中如何实现并发编程
  • Java文件上传解压
  • DICOM图像知识:解析如何在DICOM图像中实现多层覆盖层的显示的方法
  • dpdk poe丢包排查
  • 悬浮框元素定位
  • 移动语义和拷贝语义有什么区别?
  • Mumu模拟器12开启ADB调试方法
  • 【Zookeeper】二、主从应用(master-worker架构)
  • 0欧姆电阻的作用
  • Elasticsearch简介与实操
  • Spring Cloud Netflix 系列:Eureka 经典实战案例和底层原理解析
  • 第 27 章 - Go语言 构建命令行应用
  • 使用Python3实现Gitee码云自动化发布