我有这个命令
echo "<?php $x=$_GET['x']; echo $x;?>" > x.php
输出文件 x.php 是:
<?php =['x']; echo ;?>
这与 $ 变量有任何关系吗?如何避免 ???,以便我在 x 文件中获得正确的 php 代码?
答案1
你的代码:
echo "<?php $x=$_GET['x']; echo $x;?>" > x.php
由于您传递给的字符串echo
是双引号的,因此 shell 将尝试扩展其中的任何 shell 变量。该字符串包含两个这样的变量,$x
(两次) 和$_GET
。如果这些变量没有赋值,它们将被替换为空字符串。
假设您想要将字符串按原样打印到文件中,请执行以下操作:
echo '<?php $x=$_GET['"'"'x'"'"']; echo $x;?>' >x.php
在这里,我将字符串放入单身的引号。这可以防止 shell 尝试扩展其中看起来像 shell 变量的内容。
由于单引号字符串不能包含单引号,因此必须以特殊方式添加单引号。我选择"'"
通过与字符串的其余部分连接将它们添加为(双引号单引号)。
或者,转义$
字符串中的每个:
echo "<?php \$x=\$_GET['x']; echo \$x;?>" >x.php
第三种方法是使用引用的此处文档:
cat <<'PHP_END' >x.php
<?php $x=$_GET['x']; echo $x;?>
PHP_END
这样,您就不必修改实际的字符串来使 shell 正确处理它,并且您也不必记住某些 shell 的实现echo
可能会使用 C 风格转义序列等执行其他操作(如果您想要将它们插入到您的 PHP 代码中)。