- 现有文件tmp.php,期望使用Shell输出原内容
<?php
namespace api\v1;
class Module extends \yii\base\Module
{
public $class' = 'api\v1\test\Module';
}
- 使用read读取文件内容,并用echo输出。发现输出结果中
file=$1
fileTmp=$1.tmp
while read line #使用read命令循环读取文件内容,并将读取的文件内容赋值给变量line
do
echo "${line}" >> ${fileTmp}
done <$file #“done <$file”将整个while循环的标准输入指向文件$file
- 读取文件的内容后,发现转义符(\)没有读出来
namespace apiv1;
class Module extends yiibaseModule
{
public $class' = 'apiv1testModule';
}
- 经查阅 read函数 有一个参数
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
- 读取加上 -r 参数之后,发现\t \v \b被转义输出了
namespace api 1;
class Module extends yiaseModule
{
public $class' = 'api 1 estModule';
}
-
查询后发现脚本使用 #!/bin/sh 模式导致的,#!/bin/sh 中echo默认执行时会转义字符 改为 #!/bin/bash就正常了。
-
附:echo 参数 -e 和 -E参数也可以控制转义符
-n 不换行输出
-e 启用反斜线转义解释
-E 禁用反斜线转义解释(默认)
- 最终修改如下:
file=$1
fileTmp=$1.tmp
while read -r line #使用read命令循环读取文件内容,并将读取的文件内容赋值给变量line
do
echo -E "${line}" >> ${fileTmp}
done <$file #“done <$file”将整个while循环的标准输入指向文件$file