我即将在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
答案 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,那么坚持使用单一语言是有道理的。)