使用Shell的echo命令时为何字符串部分内容消失?
为什么echo命令里的$_GET消失了?
这个问题其实是shell的变量解析机制在搞鬼,我来给你拆解清楚:
问题根源
当你用双引号"包裹字符串时,Bash(以及绝大多数Linux shell)会自动扫描字符串里的变量引用——也就是所有以$开头的内容。在你的命令里,$_GET并不是shell环境中已定义的变量,所以shell会直接把它替换成空字符串。这样一来,原本的$_GET["name"]就变成了["name"],最终写入文件的内容自然就丢失了$_GET部分。
解决办法
有两种简单的方式可以避免这个问题:
1. 使用单引号包裹整个字符串
单引号'在shell中会完全禁用变量解析,里面的所有内容都会被原样输出,不会被shell修改。修改后的命令如下:
echo -e '<?php\nprint_r($_GET["name"]);' > print.php
执行这个命令后,print.php里的内容就会和你预期的一致:
<?php print_r($_GET["name"]);
2. 转义$符号
如果你一定要使用双引号,可以把$符号用反斜杠\转义,告诉shell不要把它当成变量处理。修改后的命令:
echo -e "<?php\nprint_r(\$_GET[\"name\"]);" > print.php
这里的\$会被shell识别为普通的$字符,不会触发变量解析,最终也能得到正确的PHP代码。
另外小提醒:在PHP里,数组索引用单引号也很常见,你也可以写成$_GET['name'],这样在双引号里不需要转义内部的引号,写法更简洁:
echo -e "<?php\nprint_r(\$_GET['name']);" > print.php
内容的提问来源于stack exchange,提问作者Learning Team
相关产品推荐
相关产品推荐

