Shell函数和数组(想不出来骚话了,就这样吧,累了,都毁灭吧,赶紧的)

PHP命令执行与代码执行函数安全指南:从原理到防御实战 在Web开发中,命令执行与代码执行是PHP等语言提供的强大功能,允许程序与操作系统或动态执行代码进行交互。其核心原理是通过调用系统Shell或解释器来扩展应用能力,实现文件操作、进程管理等底层功能。然而,这种能力也带来了严重的安全风险,尤其是Shell注入和代码注入漏洞,攻击者可通过构造恶意输入执行任意命令或代码,导致服务器被完全控制。从技术价值看,理解这些函数的机制是构建安全应用的基石,能帮助开发者在灵活性与安全性间取得平衡。常见应用场景包括系统管理脚本、插件化架构、模板引擎和CI/CD流水线等。本文聚焦 阅读详情


Shell函数

函数

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列
  • Shell函数定义
[ function ] 函数名(){
命令序列
[ return x ]
}
  • 调用函数的方法
函数名 [参数1][参数2]

在Shell脚本中函数的执行并不会开启一个新的子Shell,而是仅在当前定义的Shell环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。

函数的作用范围

  • 函数在Shell脚本中国仅在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令

函数的参数

  • 参数的用法
    函数名称 参数1 参数2 参数3 …
  • 参数的表示方法
    $1 $2 $3 … ${10} ${11} …

数组

数组定义方法

  1. 依次赋值
    数组名=(value0 value1 value2 ...)

  2. 跨越式赋值
    数组名=([0]=value [1]=value [2]=value ...) #[0]、[1]、[2]是下标(索引)

  3. 列表赋值
    列表名="value0 value1 value2 ..." 数组名=($列表名)

  4. 下标(索引)赋值
    数组名[0]="value" 数组名[1]="value" 数组名[2]="value"

数组包括的数据类型

  • 数值类型
  • 字符类型
    使用" "或' '定义

获取数组长度

代码如下:

arr_number=(1 2 3 4 5)
arr_length=${#arr_number[*]}
           ${#arr_number[@]}

echo $arr_length

读取某下标赋值

代码如下:

arr_index2=${#arr_number[2]}
echo $arr_index2

数组遍历

#!/bin/bash
arr_number=(1 2 3 4 5)
for i in ${arr_number[@]}
do
echo $i
done

数组切片

arr=(1 2 3 4 5)
echo ${arr[@]}          #输出整个数组

echo ${arr[@]:1:2}      #获取 ${数组名[@或*]:起始位置:长度} 的值

echo ${arr[@]:2:3}

数组替换

arr=(1 2 3 4 5)

echo ${arr[@]/4/66}      #${数组名[@或*]/查找字符/替换字符}
echo ${arr[@]}           #并不会替换数组原有内容

arr=(${arr[@]/4/66})     #要实现改变原有数组,可通过重新赋值实现
echo ${arr[@]}

数组删除

arr=(1 2 3 4 5)
unset arr            #删除数组
echo ${arr[*]}

arr=(1 2 3 4 5)
unset arr[2]        #删除下标为 2 的元素(即第三个元素)
echo ${arr[*]}

数组追加元素

方法一:
通过下标来追加元素

array_name[index]=value

方法二:
将数组的长度作为下标来追加元素

array_name[${#array_name[@]}]=value

方法三:
重新整合数组,然后在后面追加

array_name=("${array_name[@]}"value1 ... valueN)
#双引号不能省略,否则当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
#不能将“@”替换成“*”,否则会将数组array_name中的所有元素作为一个元素添加到数组中

方法四:
直接追加

array_name+=(value1 ... valueN)
#待添加元素必须用“()”包围起来,并且多个元素之间用空格分隔

向函数传数组参数

如果将数组变量作为函数参数,函数只会取数组变量的第一个值

test() {
  echo "接收到的参数列表:$@"
  newarrary=$1
  echo "新数组的值为:${newarrary[*]}"
}

array=(3 2 1 4 5)
echo "原数组的值为:${array[*]}"
test1 $array

解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量

test2(){
  newarrary=($(echo $@))
  echo "新数组的值为:${newarrary[*]}"

}

arrary=(3 2 1 4 5)
echo "原始数组的值为:${arrary[*]}"
test2 ${arrary[*]}

从函数返回数组

test2() {
   newarrary=(`echo $@`)

   sum=0
   for value in ${newarrary[*]}
   do
     sum=$[$sum + $value]
   done
   echo $sum
}

test3() {
   newarrary=(`echo $@`)
   for ((i=0; i<=$[$# - 1]; i++))
   {
     newarrary[$i]=$[${newarrary[$i]} * 2]
   }
   echo ${newarrary[*]}
}

array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
result1=`test2 ${array[*]}`
echo "新数组的和为:$result1"

result2=(`test3 ${array[*]}`)
echo "新数组的值为:${result2[*]}"

数组排序算法

冒泡排序

类似气泡上涌的过程,会将元素在数组中从大到小或者从小到大不断地向前移动

  • 基本思想:
    冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换位置),这样较小的元素就像气泡一样从底部上升到顶部
  • 算法思路
    冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要再对比了,同时数组的排序已经完成了。而内部循环主要用于对比数组中每个响邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
#!/bin/bash
array (63 4 24 1 3 15)

for ((i=1; i<${#array[*]}; i++))                 #比较轮数为数组长度减1,从1开始
do
  for ((j=0; j<${#array[*]}-i; j++))             #比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
  
  do
    if [ ${array[$j]} -gt ${array[$[$j+1]]}]     #如果第一个元素比第二个元素大就互换
    then
       temp=${array[$j]}                         #把第一个元素值保存到临时变量里面
       array[$j]=$[array[$[$j+1]]]               #把第二个元素值保存到第一个元素里面
       array[$[$j+1]]=$temp                      #把临时变量(也就是第一个元素原值)保存到第二个元素中
    fi
  done
done

echo ${array[*]}

直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会更快

  • 基本思想:
    将指定排序位置与其他数组元素分别做对比,如果满足条件就交换元素值,注意这里和冒泡排序不同,并不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序号的格式
#!/bin/bash
array=(63 4 24 1 3 15)
length=${#array[*]}
for ((i=1; i<$length; i++))
do
  index=0
  for ((j=1; j<=$length-i; j++))
  do
    if [ ${array[$j]} -gt ${array[$index]} ];then
       index=$j
    fi
    
  done
  temp=${array[$length-$i]}
  array[$length-$i]=${array[$index]}
  array[$index]=$temp
done

echo ${array[*]}

反转排序

以相反的顺序把原有数组的内容重新排序(只是与原排序相反,不会将内容按照顺序排序)

  • 基本思想:
    把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换
#!/bin/bash
array=(10 20 30 40 50 60)
length=${#array[*]}
for ((i=0; i<$length/2; i++))
do
  temp=${array[$i]}
  array[$i]=${array[$length-1-$i]}
  array[$length-1-$i]=$temp
done

echo ${array[*]}

FortiSandbox命令注入漏洞(CVE-2026-39808)分析与防御实战 命令注入是一种常见且高危的Web安全漏洞,其原理在于应用程序未对用户输入进行充分验证和过滤,直接将用户可控数据拼接到系统命令中执行,导致攻击者能够注入恶意命令。这种漏洞的技术价值在于它绕过了应用层权限控制,直接与操作系统交互,通常可导致服务器完全沦陷。在应用场景中,命令注入常见于需要调用系统功能的管理后台、文件处理接口和系统工具集成模块。本文以FortiSandbox高危漏洞(CVE-2026-39808)为典型案例,深入剖析其利用手法,该漏洞允许未授权攻击者通过管道符号注入恶意载荷,并以root权限执行任 阅读详情

相关推荐

DeepSeek-V4-Pro接入Reasonix:Agent协议对齐与本地调试实战

大模型Agent框架的核心在于工具调用(Tool Calling)协议的精准实现,而非简单替换API端点。DeepSeek-V4-Pro作为生产级Agent模型,要求严格遵循`tool_choice`、`tools` Schema及`response_format`等结构化交互规范;Reasonix则是一个面向开发者工作流的Node.js智能代理运行时,其扩展能力依赖于自定义Provider对协议的双向翻译。本文聚焦Agent工程落地中的关键挑战:OpenAI兼容层与DeepSeek原生协议的语义鸿沟、JS

weixin_33980459的博客 419

P101 例5-2 定义有3行、4列int类型的二维数组a,先逐行分别给数组元素赋数据1,2,3,...,12,然后显示数组中的数值。要求:分别把申请二维动态数组的过程和释放二维动态数组的过程编写成函

P101 例5-2 定义有3行、4列int类型的二维数组a,先逐行分别给数组元素赋数据1,2,3,…,12,然后显示数组中的数值。要求:分别把申请二维动态数组的过程和释放二维动态数组的过程编写成函数。 #include<stdio.h> #include<stdlib.h> int **Make2DArray(int row,int col) { int **a,i; a=(int **)calloc(row,sizeof(int *)); for(i=0;i<

AKK188888881的博客 1168

OpenClaw飞书集成:构建本地优先的AI数字副驾驶

AI Agent(智能体)是具备自主规划与执行能力的下一代AI应用形态,其核心在于将大模型的推理能力与本地系统工具链深度耦合。OpenClaw作为典型的本地优先AI网关(AI Gateway),通过Gateway-Node双层架构实现自然语言到Shell、摄像头、浏览器等真实设备能力的可靠翻译,突破云端模型‘只能想不能做’的局限。该方案强调数据不出域、权限最小化、事件驱动响应,天然适配企业安全治理要求,并已在飞书生态中落地为日程管理、文档生成、实时图像分析等高频办公场景。本文详解其在飞书平台上的安全接入、W

weixin_33957648的博客 392

【C语言篇】二维数组编程案例

C语言基础知识

m0_66492811的博客 267

PHP文件包含漏洞深度解析:从原理到实战攻防

文件包含是Web开发中常见的代码复用机制,其核心原理是通过include、require等函数将外部文件内容动态引入当前脚本执行。然而,当用户输入未经严格过滤直接拼接进包含路径时,这一机制便可能演变为严重的安全漏洞——文件包含漏洞。该漏洞允许攻击者读取服务器敏感文件,甚至将非代码文件以PHP方式解析执行,技术价值在于其隐蔽性和高危害性,常被用于权限提升、信息窃取等攻击链中。在应用场景上,无论是本地文件包含还是远程文件包含,攻击者均可利用路径遍历、伪协议、日志注入等多种手法实现攻击。本文聚焦PHP文件包含漏洞

areen7003的博客 310

WordPress插件反序列化漏洞实战:CVE-2024-9593分析与复现

反序列化是软件开发中常见的数据转换机制,尤其在PHP生态中,serialize()与unserialize()函数被广泛用于对象持久化与网络传输。其原理是将数据结构转换为字符串格式以便存储或传输,反序列化则将其还原为原始对象。然而,当用户可控的输入未经严格校验直接传入unserialize()函数时,攻击者可能构造恶意序列化字符串,触发PHP魔法方法(如__destruct、__wakeup)中的危险操作,形成远程代码执行漏洞。这种技术缺陷在WordPress插件生态中尤为突出,由于插件质量参差不齐,开发者

weixin_30251829的博客 450

C语言二维数组定义、赋值、按要求遍历操作、输出以及函数调用

一、建立二维数组并赋值 程序1: #include <stdio.h> int main() { int a[6][6],i,j; //定义一个六行六列的二维数组 for(i=1;i<6;i++) for(j=1;j<6;j++) a[i][j] = (i/j)*(j/i); //对除第一行以及第一列的所有元素赋值,i/j保留整数值 for(i=1;i<6;i++) {

TTTSEP9TH2244的博客 3万+

别再只盯着轨迹线了!FLUENT DPM后处理实战:从粒子采样到直方图报告的完整流程

本文详细介绍了FLUENT DPM后处理的完整流程,从粒子采样到直方图报告的实战技巧。通过设置采样面、分析.dpm文件数据以及创建加权直方图,帮助工程师获取粒子速度、粒径分布等定量信息,提升多相流模拟的深度分析能力。特别适合需要超越轨迹线分析的CFD工程师。

weixin_28730353的博客 279

Labview数据类型作业

Labview数据类型实验

qq_65101190的博客 2559

abb机器人指令手册_ABB机器人配置圆形输送链跟踪

更多内容请点击上方ABB机器人实战技巧关注也可点击公众号下方往期经典浏览更多内容转载请先后台留言,大家一起支持原创,推动机器人使用和发展本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言1. 通常的机器人输送链跟踪,均为直线输送链跟踪,例如下图2. 有些情况,输送链为圆形,例如...

weixin_39849894的博客 2047

山东大学软件工程应用与实践——GMSSL开源库(六)——SM9密钥交换协议

2021SC@SDUSC 文章目录基本概念符号及辅助算法SM9密钥交换协议 基本概念 1976年,Diffie和Hellman在其题为《密码学的新方向》的论文中首次给出了公钥密码学的定义,并提出了Diffie-Hellman密钥交换算法。该算法解决了对称密码体制中的密钥分发问题,使得通信双方可以通过公开信道安全地交换共享密钥。 使用SM9通信的双方通过对方的标识和自身的私钥,经过两次或者可选的三次信息传递过程,计算获取一个由双方共同决定的共享秘密密钥。该密钥可以作为对称密码算法的会话密钥,其中可选步骤用来实

m0_51588039的博客 1988

LabVIEW-数组数据类型

数组是将一系列、同一类型的数据组合到一起。在LabVIEW 中,数组可以是字符串类型、数值型或者布尔型等多种数据类型中的同类数据的集合。但不能创建以数组为元素的数组,也不能创建图标和图形数组。求数组大小、初始化数组、创建数组、索引数组、替换数组子集、搜索一维数组、删除数组元素。

qq_58969626的博客 1万+

多智能体强化学习MASAC算法:从原理到PyTorch实战详解

深度强化学习通过智能体与环境的交互试错来学习最优策略,是解决复杂序列决策问题的核心技术。其核心原理在于利用价值函数或策略梯度来最大化累积奖励,在机器人控制、游戏AI等领域展现出巨大技术价值。当面对多个智能体需要协同或竞争的复杂动态环境时,单智能体算法因环境非平稳性而面临挑战,多智能体强化学习应运而生。Multi-Agent Soft Actor-Critic (MASAC) 算法融合了SAC的稳定高效与中心化训练去中心化执行的范式,通过维护中心化Critic网络和独立策略网络,有效解决了多智能体协作中的信用

weixin_30080745的博客 334

subprocess shell=True的测试

最近用到了python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下:` from subprocess import call import shlexcmd = “cat test.txt; rm test.txt” call(cmd, shell=True) ` 运行之后: 1:打开并浏览了test.txt文件

monicholas的专栏 3239

实现边缘实时动物检测:YOLOv5模型优化与树莓派4B部署全攻略

本文介绍了基于高性能计算机训练YOLOv5目标检测模型,并部署到树莓派4B实现实时动物检测的全流程。主要内容包括:1)在高性能计算机上通过Anaconda创建虚拟环境,安装YOLOv5项目并进行模型训练;2)将训练好的best.pt模型迁移到树莓派,配置轻量级Miniconda环境;3)连接树莓派摄像头,运行实时检测程序。该系统兼顾了训练效率和边缘设备部署的实用性,可广泛应用于智慧农业、生态监测等场景。文中详细说明了数据准备、环境配置和部署步骤,为开发轻量级目标检测系统提供了完整参考方案。

m0_64661770的博客 201

(汇总篇)语义SLAM相关开源方案| 全球优秀作者与实验室 | SLAM学习资料整理

SLAM 与深度学习相结合的工作当前主要体现在两个方面,一方面是将语义信息参与到建图、位姿估计等环节中,另一方面是端到端地完成 SLAM。针对建图的工作一方面是利用几何信息进行稠密重建,另一方面很多工作利用语义信息达到了很好的语义重建效果,三维重建、SFM。动态 SLAM 也是一个很值得研究的话题,这里不太好分类,很多工作用到了语义信息或者用来三维重建,收集的方案相对较少。优化可能是 SLAM 中最难的一部分了吧 +_+ ,一般都是直接用现成的因子图、图优化方案,要创新可不容易。

熊猫小妖的AI世界 7871

Shell排序(java版)

希尔排序实质上是一种分组插入方法。 它的基本思想是: 对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的,希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

程序员乌拉的博客! 762

60、拓扑码:从理论到应用

本博客深入探讨了拓扑码的基本理论、构造方法及其在量子计算中的应用。重点介绍了颜色码的拓扑起源、编码量子比特的计算方法、弦算子的构造与性质、边界条件的影响、同调描述以及与统计模型相关的错误阈值分析。同时,还涵盖了拓扑码的历史发展、与其他拓扑码的关系、与凝聚态系统的联系,以及其在激发态和高维中的表现。博客展示了拓扑码在容错量子计算和未来量子信息领域的广阔前景。

o1p2q3r的博客 129

Python中subprocess 模块 创建并运行一个进程

python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" call(cmd, shell=True)运行之后: 1:打开并浏览了test.txt文件 2:删除了test...

anyi6536的博客 255

对角两对双差速轮AGV的平移、直行、转弯和原地旋转之PID控制

本示例将展示如何使用PID控制算法,控制具有对角线布置的两对双差速轮(左前和右后)的AGV,实现平移、直行、转弯和原地旋转等运动。通过对车辆的运动学和PID控制器的设计,我们可以精确地控制AGV的运动

xiaoc100200的博客 1512

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

零基础编程必备:Linux命令行核心20%命令与文件系统思维实战指南

你是不是也遇到过这样的场景:刚接触编程,满怀热情地打开教程,第一步就卡在了“请打开终端,输入以下命令……”?看着屏幕上闪烁的光标和一堆看不懂的字母,瞬间感觉自己和计算机之间隔着一道天堑。 这太正常了。对于零基础的编程学习者来说,Linux命令行就像一门外语,而网上动辄几百条的命令大全,更像是字典,而非教程。你需要的不是一本字典,而是一张能带你快速入门、解决实际问题的“生存地图”。 这篇文章,就是为你准备的这张地图。我不会给你罗列上千条你一辈子都用不上的命令,而是聚焦于一个核心判断: 对于零基础编程学习者,真

weixin_33744854的博客 850

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Linux文件操作(二)

文件操作的第二部分,介绍文件和目录相关操作,主要是目录,还有一些错误的处理方式

C_eeking的博客 1181

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Web 安全漏洞之 OS 命令注入

SQL 是一种结构化字符串语言,攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句。

shandongjiushen的博客 506

【Java/Go后端手撸原生Agent(第五篇):多工具并行调用 + BashTool执行引擎 + Judge证据链升级】

本文介绍了Agent开发的三大核心升级:多工具并行支持、新增BashTool执行能力、Judge证据链增强。首先解决了单工具串行瓶颈,通过遍历tool_calls数组实现多工具批量执行;其次新增带安全防护的BashTool,使Agent具备Shell执行能力,完成从"只读顾问"到"能读能写能执行"的转变;最后增强Judge模块,引入工具调用轨迹证据链,实现基于事实的质量校验。这些升级提升了Agent的并行处理能力、执行能力及回答可信度,同时保持了架构的可扩展性。通过分层防御设计,确保Shell执行的安全性。

llwszx的博客 376

ThinkPHP 5.x远程命令执行漏洞深度剖析与安全加固实战

远程命令执行(RCE)漏洞是Web安全领域的高危威胁,它允许攻击者在目标服务器上执行任意系统命令,从而完全控制服务器。其原理通常源于应用程序对用户输入的处理不当,例如未经过滤或验证的参数被传递给危险函数(如eval、system等)。这类漏洞的技术价值在于揭示了应用程序逻辑缺陷与系统层访问之间的危险桥梁,常出现在动态语言框架的路由解析、参数绑定或反序列化机制中。在PHP开发中,ThinkPHP等流行框架因其便捷的路由和自动加载机制而广泛应用,但若安全设计不足,其核心调度逻辑可能成为攻击入口。本文以Think

weixin_30617797的博客 312
上一篇: 小菊花宝宝课堂开课了,教你认识各种形状——用脚本绘图
下一篇: 啊!我的头发!!——文本处理命令和Shell正则表达式
Alterego_
博客等级 码龄6年 14粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值