坏替换Bash:如何将heredoc写入动态创建的文件(变量)?

时间:2016-01-24 16:24:07

标签: php bash shell

我即将在php中生成大量调查。

我使用Bash通过cat命令添加某种自动化。所以我使用Bash生成.php个文件。

要添加新调查,我的Bash脚本会使用filecount='ls -l ${survey_dir}${survey_category} | wc -l'对调查目录中的文件进行计数。我想使用filecount生成下一个调查的文件名。因此,如果survey_category目录有两个文件,则新文件名将为3.php

在启动heredoc之前,我发出以下变量和命令:

filecount=$((filecount+1))
newfile="${wd}${catg}/${filecount}.php"
cat > ${newfile} <<-EOF
...
EOF

当我执行脚本时,cat命令会产生错误消息&#39;错误替换&#39;。

我尝试通过引用<<-EOF<<-'EOF'来解决这个问题,但是我在php中使用了很多变量替换,因此无法实现此解决方案。

我检查ls -l /bin/bash是否实际链接到bash而不是dash或其他sh shell。

我检查过我的&#39; shebang&#39;是#!/bin/bash而不是#!/bin/sh。检查确定。

此外,我尝试在变量${newfile}上使用单引号和双引号:无济于事。

调试信息#!/bin/bash -x

: bad substitution
+ [[ 1: == \2\: ]]
+ [[ 1: == \3\: ]]
+ [[ 1: == \4\: ]]

我的问题是:如何将heredoc写入动态创建的文件中?

导致问题的代码:

    echo -e "Your question please:"
    read -e rvraag
    rvraag="${rvraag//\"/\^}"
    salt=`date +"%s"`
    filecount=`ls -l ${wd}${catg} | wc -l`
    filecount=$((filecount+1))
    newfile="${wd}${catg}/${filecount}.php"
    cat > ${newfile} <<-EOF

    <?php
     session_start();
    \$st_code =\$_SESSION['studentnr'];
    \$cursuscode ="${catg}";
    \$rdir="/var/www/qqlq.org/www/gen_enq/";
    require_once \$rdir.'/inc/error_reporting.inc';
    require_once \$rdir.'/src/clsQuestionProgress.class.php';
    \$myQuestionProgress = new clsQuestionProgress();
    \$myQuestionProgress->fCreateQuestionProgress( \$st_code, \$cursuscode );
    require_once \$rdir.'/inc/header.inc';
    require_once \$rdir.'/src/clsWriteProgress.class.php';
    echo "<div class='container'><hr>
    Vraag ${catg} ${filecount}<h4> ${rvraag}</h4><br><br>
    <form name='qradio' action =".\$_SERVER['PHP_SELF']." method= 'POST'>
    <div class='radio'><label><input type='radio' name='${catg}${salt}'

    value='1'>${answ1}<label></div>
        <div class='radio'><label><input type='radio' name='${catg}${salt}' value='2'>${answ2}<label></div>
        <div class='radio'><label><input type='radio' name='${catg}${salt}' value='3'>${answ3}<label></div>
        <div class='radio'><label><input type='radio' name='${catg}${salt}' value='4'>${answ4}<label></div>
       <input type='submit' class='btn btn-warning' name='btnCancel${salt}' value='Go Back'>
       <input type='submit' class='btn btn-success' name='btn${catg}${salt}' value='Ok'>
    </form>
    <hr></div>";
    if (  \$_POST['${catg}${salt}'] == "${answok}" && isset( $_POST['btn${catg}${salt}'] ) ){
          \$myProgress = new clsWriteProgress();
          \$tablename = 'q'.\$st_code.\$cursuscode;
          \$myProgress->fSetProgress( \$tablename, \$_SESSION["leerjaar"],$st_code,\$cursuscode,"${rvraag}",1 );
          \$nextpage=${filecount)+1;
          echo '<script>location.replace("'.\${nextpage}.php.'");</script>';
    }//end if

     if (  \$_POST['${catg}${salt}'] !== "${answok}" && isset( \$_POST['btn${catg}${salt}'] ) ){

          \$tablename = 'q'.\$st_code.\$cursuscode;
          \$myProgress = new clsWriteProgress();
          \$myProgress->fSetProgress( \$tablename, \$_SESSION["leerjaar"],\$st_code,\$cursuscode,"${rvraag}",0 );
          \$nextpage=${filecount)+1;
          echo '<script>location.replace("'.${nextpage}.php.'");</script>';
    }//end if

    if ( isset( \$_POST['btnCancel${salt}'] ) ){
            echo '<script>location.replace("../../studyoverview.php" );</script>';

    }//end if
EOF

4 个答案:

答案 0 :(得分:2)

我相信heredoc的语法是&lt;&lt;不是&lt;&lt; -

答案 1 :(得分:2)

正如Benjamin W的评论所指出的那样,问题是在应该写入文件的PHP代码中引起的。

在我写的代码中 $nextpage=${filecount)+1;标记括号!

应该是: $nextpage=${filecount}+1;

分析“错误替换”错误的策略是从一个空的bash脚本开始。 之后我写了一行一行的heredoc骨架。 如果没有错误返回,我会粘贴以下行,依此类推,直到我达到'$ filecount} +1'表达式。

问题解决了,感谢您的反馈!

答案 2 :(得分:0)

@kzpm:基于您提供的代码,这对我有用:

!/bin/bash

wd="/tmp/workdir/"
catg="survey01"
mkdir -p ${wd}${catg}
filecount=`ls ${wd}${catg} | wc -l`
filecount=$((filecount+1))
newfile="${wd}${catg}/${filecount}.php"
echo "${newfile}"
cat > ${newfile} <<-EOF
<?php ..... ?>
EOF

我做出的改变:
1. ls的反引号(代码中的单引号,可能就是这种情况)
2.在开头移动设置catg值(您在filecount之后声明它)

答案 3 :(得分:0)

如果您在已知安装了PHP的环境中工作,只需将其重写为PHP shell脚本即可。说真的,有些头疼并不值得你花时间。如果你正在寻找快速和肮脏的东西,那么Bash是很好的,但是一旦你开始将某些字符(主要是美元符号)投入混合中,你就会为自己进行大量的调试。

从命令行使用PHP的详细信息:
http://www.php.net/cli

您可以使用以下命令在命令行中输入用户输入:

echo "Your question please: ";
$question = fgets(STDIN);

(有些人无疑会认为Python或Perl是更好的赌注,但是既然你无论如何都要输出PHP,那么坚持使用单一语言是有道理的。)