eval && 倒引号 && $()

本文详细介绍了Shell中命令置换的概念及应用,包括倒引号(`)和$()两种方式的特点与区别,通过具体示例展示了如何利用这两种方法进行命令置换,同时对比了它们在转义字符处理上的不同。

倒引号

倒引号的表示“,也叫反引号。
倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个倒引号部分。
如:
这里写图片描述
shell在执行此条命令时,先执行倒引号中的命令date,将输出结果取代$today。
利用倒引号的这种功能可以进行命令置换,即把倒引号括起来的命令的执行结果赋给指定变量。

进行命令置换时,可以是单条命令,也可以是多条命令的组合
如:
这里写图片描述
另外,倒引号还可以嵌套使用,但应注意,要加”\”进行转义。
如:转义后:
这里写图片描述
不转义:
这里写图片描述


$()

()shellshell  ()部分。
这里写图片描述
可以看出使用倒引号和$()结果一样,但是为什么还要两个都使用?
那是因为因为它们还有区别的:
先看两个例子:
第一个:
这里写图片描述这里写图片描述
第二个:
这里写图片描述
这里写图片描述
由这两个例子可以看出倒引号和$()的区别。

**倒引号对 \ 进行了转义 ,要向使用 \ 就需要加 \ 。
而$()未进行转义,就是普通的 \ 。**


eval

eval是条命令,重新运算求出参数的内容。(主要用来两次扫描参数)
格式为:eval [arg …]
它利用别的命令行作为自己的参数,进行相应的变量或命令替换,并把替换结果结合成一个新的命令行,然后读取并加以执行。

(1)eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。

(2)eval可以用于回显简单变量
这里写图片描述
这里写图片描述

(3)两次扫描
这里写图片描述
这里写图片描述
第一次扫描将$redirect替换为>,第二次执行ls > file,因此完成重定向。

(4)获得最后一个参数
这里写图片描述
这里写图片描述

参考博客:
http://blog.youkuaiyun.com/chenxucx/article/details/73771687
http://blog.youkuaiyun.com/xy913741894/article/details/73741758

### `eval("$$v1 = &$$v2;")` 的功能和原理 - **功能**:`eval("$$v1 = &$$v2;")` 的功能是将变量 `$v2` 的引用赋值给变量 `$v1` 所代表的变量名对应的变量。也就是说,它会动态地创建一个变量,该变量名由 `$v1` 的值决定,并且这个新变量会引用 `$v2` 所代表的变量名对应的变量的值。 - **原理**: - `eval()` 是 PHP 中的一个内置函数,它可以将字符串作为 PHP 代码来执行。在这个例子中,传入 `eval()` 的字符串是 `"$$v1 = &$$v2;"`。 - `$$v1` 和 `$$v2` 是 PHP 中的可变变量。可变变量允许使用一个变量的值作为另一个变量的名称。例如,如果 `$v1 = "foo"`,那么 `$$v1` 就相当于 `$foo`。 - `&` 是引用赋值运算符,它会创建一个变量的引用,而不是复制变量的值。所以 `$$v1 = &$$v2;` 实际上是将 `$$v2` 的引用赋值给 `$$v1`。 以下是一个简单的示例来解释可变变量和引用赋值: ```php $varName = "newVar"; $value = 10; $$varName = &$value; echo $newVar; // 输出 10 $value = 20; echo $newVar; // 输出 20,因为 $newVar 是 $value 的引用 ``` ### `var_dump($$v1)` 的功能和原理 - **功能**:`var_dump($$v1)` 的功能是输出 `$$v1` 所代表的变量的详细信息,包括变量的类型和值。 - **原理**: - `var_dump()` 是 PHP 中的一个内置函数,用于输出变量的详细信息,包括变量的类型(如整数、字符串、数组等)和值。 - 同样,`$$v1` 是可变变量,它会根据 `$v1` 的值来确定要输出的变量。 ### 示例代码 结合 `getFlag` 函数的完整示例如下: ```php function getFlag(&$v1, &$v2) { eval("$$v1 = &$$v2;"); var_dump($$v1); } $v1 = "newVar"; $v2 = "value"; $value = 10; getFlag($v1, $v2); ``` 在这个示例中,`getFlag` 函数会将 `$value` 的引用赋值给 `$newVar`,然后输出 `$newVar` 的详细信息。 ### 潜在问题 - **安全风险**:由于使用了 `eval()` 函数,并且 `$v1` 和 `$v2` 是用户可控的,攻击者可以通过构造恶意的输入来执行任意 PHP 代码,从而导致安全漏洞。 - **错误处理**:如果 `$v1` 或 `$v2` 的值不符合预期,可能会导致语法错误或其他运行时错误。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值