2016-01-24 45 views
2

我即將在php中生成大量調查。壞取代Bash:如何將heredoc寫入動態創建的文件(變量)?

我使用Bash添加某種自動化與cat命令。所以我使用Bash生成.php文件。

要添加新的調查,我的Bash腳本使用filecount='ls -l ${survey_dir}${survey_category} | wc -l'統計調查目錄中的文件。我想用filecount來生成下一個調查的文件名。所以如果survey_category目錄有兩個文件,新文件名將是3.php

開始定界符之前,我發出以下變量和命令:

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

當我執行命令cat產生錯誤消息「壞替代」的腳本。

我試圖通過引用<<-EOF來解決這個問題:像<<-'EOF',但是我在php中使用了很多變量替換,所以這個解決方案無法實現。

我檢查了是否ls -l /bin/bash實際上鍊接到bash而不是dash或另一個sh殼。

我檢查了我的'shebang'是#!/bin/bash而不是#!/bin/sh。檢查確定。

此外,我試圖在變量${newfile}上使用單引號和雙引號:無濟於事。

調試信息#!/bin/bash -x

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

我的問題是:如何編寫定界符動態創建的文件?

代碼導致該問題:

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

這是懷疑 - 'cat> $ {newfile} << - EOF' - 刪除破折號 –

+0

@Ed Heal:當我刪除破折號時出現錯誤消息:'警告:這裏 - 文檔在第57行(通緝'EOF')'。我需要短劃線跳過腳本中的標籤.. – kzpm

+0

你能發佈整個代碼嗎?刪除短跑不應導致這樣的錯誤。 – nsilent22

回答

2

正如Benjamin W的評論指出的那樣,問題是由ph p代碼應該已被寫入文件。

在我的代碼中,我寫了 $nextpage=${filecount)+1;標記括號!

它應該是: $nextpage=${filecount}+1;

分析「壞替代」錯誤的策略,是先建立一個空bash腳本。之後,我寫了heredoc骨架逐行測試它。 當沒有錯誤返回時,我粘貼下面一行,依此類推,直到到達'$ filecount} +1'表達式。

問題解決了,謝謝您的反饋!

2

我相信一個定界符語法< <不< < -

+2

從'man bash':如果重定向操作符是<< - ,則從輸入行和包含分隔符的行中剝離所有前導製表符字符 。這允許在這裏 - shell腳本中的文檔以自然的方式縮進。 – nsilent22

+0

@Todd:短劃線「-'用於忽略結果文件中的選項卡。看到我對Ed Heal的評論 – kzpm

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(在你的代碼,可能是單引號是這種情況),(你filecount後宣佈它)

0

就改寫這是一個PHP shell腳本,如果你
2.移動在年初設定catg值在你知道安裝了PHP的環境中工作。嚴重的是,一些頭痛只是不值得你花時間。如果你在尋找快速而骯髒的東西,Bash會很好,但是一旦你開始將某些角色(主要是美元符號)投入混音中,你就會爲自己設置很多調試。
http://www.php.net/cli

你可以在命令行中使用獲取用戶輸入:

使用PHP命令行詳細

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

(有些人會在Python或Perl的無疑磬是更好的賭注,但是因爲你無論如何都在輸出PHP,所以堅持使用單一的語言是合理的。)