• ベストアンサー

シェルでsyntax errorがでてしまう

温度管理をするため、CentOS4.4上で下記のようなスクリプトを動かしています。 ---スクリプト始まり--- #!/bin/bash date=$(date '+%Y/%m/%d(%a)/%R') rh=$(/var/usbrh/usbrh -1 2>&1) limit=35 rh_judge=$(echo $rh | cut -c14-15) if (( ${rh_judge} >= ${limit} )) ;then alert=alert else unset alert fi echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log ---スクリプト終わり--- このスクリプトで、ログを出力し、limit以上の数値になった場合、alertがログに書き込まれるようにできました。 そこでコレを少し改良してalert時にメールを飛ばせる様にしたいと思い下記のようにif文を差し替えました。 ---if文始まり--- if (( ${rh_judge} >= ${limit} )) ;then alert=alert address="xxx@hogehoge.com" subject="TemperatureAlert" mail -s $subject $address << END `$rh` END else unset alert fi ---if文終わり--- ところが、 echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log のあとの行(line23)で line 23: syntax error: unexpected end of fileというのが出て スクリプトが動かなくなってしまいました。 ログの書き込み部分は問題ないと思うのですが、原因がわかる方いらっしゃいますでしょうか。 ご指摘頂ければ幸いです。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

気になるのは `$rh` かなぁ? $rh に入っている文字列を, コマンドとして実行したいの? もしそうだとしても, $rh | mail ... の方が素直じゃないかなぁ. あと, ヒアドキュメントを終わらせる END の前後に空白がないことも確認してください.

balvenie12
質問者

お礼

ヒアドキュメントの空白・・・まさにそのとおりでした! 終わりのENDの前に空白TAB(文書整形のため)が入っていたのですが これが原因だったようです。 ご指南ありがとうございました。

その他の回答 (2)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

こちらのdebianにcopy&pasteして実行してみましたが,ine 23: syntax error: unexpected end of fileというエラーは出ませんでした. rh=$(/var/usbrh/usbrh -1 2>&1) mail -s $subject $address << END `$rh` END ってのが怪しいですけどね. usbrhコマンドの出力を変数rhに入れておいて,ヒアドキュメントの中で,rhの内容を実行していますが,正しい? usbrhの出力をメールで送りたいだけではないのですか? echo "$rh" |mail -s $subject $address とか, mail -s $subject $address << END $rh END でいいのでは?

balvenie12
質問者

お礼

>usbrhの出力をメールで送りたいだけではないのですか? そのとおりです。 ご指南くださった mail -s $subject $address << END $rh END というのが正しいです。 早速修正して使わせて頂きました。ありがとうございます。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

差し替えて云々がとっても怪しいので、できれば 変更後のものを丸々提示してもらえませんか?

balvenie12
質問者

補足

興味を示していただきありがとうございます。 変更後のスクリプトをそのまま示します。改行、行間もそのままです。 気になる点がありましたらご指摘いただければ幸いです。 ----変更後のスクリプト---- #!/bin/bash date=$(date '+%Y/%m/%d(%a)/%R') rh=$(/var/usbrh/usbrh -1 2>&1) limit=35 rh_judge=$(echo $rh | cut -c14-15) if (( ${rh_judge} >= ${limit} )) ;then alert=alert address="xxx@hogehoge.com" subject="TemperatureAlert" mail -s $subject $address << END `$rh` END else unset alert fi echo ${date} ${rh} ${alert} >> /var/usbrh/usbrn_tes.log ---スクリプト終わり--- 宜しくお願いいたします。

関連するQ&A

  • Linuxを勉強中のものです。

    Linuxを勉強中のものです。 IF文の複合文で困っております。 (OSはCentOS5.4です) #!/bin/sh DATE=`date +%Y%m%d --date '1 day ago'` address1=test@test.co.jp address2=admin@test.co.jp subject1="ccc.logは削除されませんでした" subject2="ccc.logは削除されました" subject1=`echo $subject | nkf -j` subject2=`echo $subject | nkf -j` honbun1="bbb.logが見付からなかったため、ccc.logは削除されませんでした。" honbun2="aaa.logが見付からなかったため、ccc.logは削除されませんでした。" honbun3="ccc.logは削除されました。" if [ -e aaa.gz ]; then if [ -e bbb.gz ]; then { rm -f ccc.log; mail -s "$subject2" $address1 -- -f $address2 << honbun; `echo $honbun3 | nkf -j`; honbun; } else { mail -s "$subject1" $address1 -- -f $address2 << honbun; `echo $honbun1 | nkf -j`; honbun; } fi else { mail -s "$subject1" $address1 -- -f $address2 << honbun; `echo $honbun2 | nkf -j`; honbun; } fi 上のシェルスクリプトを実行すると、エラー表示され動作しません。 エラー >> line 32: syntax error: unexpected end of file どんな些細な情報でも結構ですので、ご教授下さい。 宜しくお願い致します。

  • シェルスクリプトでエラー時にリトライ方法

    下記のようなシェルスクリプトを作成したいと思っています。 apacheのアクセスログを確認し、 (1)httpステータスが200なら後続の処理を実行 (2)200以外ならエラーを表示させ、  200以外なら5回リトライして5回ともhttpステータス"200"が一度も返ってこなければ(grepに含まれていなければ)スクリプトを中止するような処理を行いたいです。 初心者でループ処理?リトライ処理?というのがよくわかっていなくて… 下記のようなスクリプトにどう手を加えたらいいかご教授いただけますでしょうか。 #!/bin/sh cd /XXX/apache/log if tail -n 5 access_$DATE.log grep "|200|" >/dev/null; then tail -n 5 access_$DATE.log grep "|200|" echo "httpステータスは200です" else echo "httpステータスは200以外です" exit fi : よろしくお願いします

  • ネストしない複数のif文でelseは必要でしょうか

    if文についての疑問を質問させてください。 if文はelseを挟むことで複数指定したり入れ子にしたりして使えますが、 elseを未入力で下記のように複数指定することは問題があるのでしょうか。 また、このように24個のifを並べるという書き方はよろしくないものなのでしょうか。 <script type="text/javascript"> (function() { var image_obj = new Image(); image_obj.src = "../image/"; var jikan_obj = new Date(); var htime = jikan_obj.getHours(); if(htime==0){alert('日が変わりました');} if(htime==1){alert('夜中です');} if(htime==2){alert('2時です。');} if(htime==3){alert('真夜中です');} if(htime==4){alert('もうじき朝です');} if(htime==5){alert('新聞が届きました');} if(htime==6){alert('朝です');} if(htime==7){alert('忙しいです');} //これが23まで続きます。 if(htime==23){alert('もうじき日が変わります');} })(); </script>

  • Linuxのシェルについて

    いつもお世話になっております。 Linux(redhat)でのシェルスクリプトを作成したいと思いますが、あるコマンドを実行して実行成功したか失敗したかをstatusで拾う形にしたのですがうまくいきません。アドバイスをお願いします。 例: #!/bin/sh set ST = $status date ←コマンド if [ $ST == 0 ]; then echo "**************" echo "* o k *" echo "**************" exit $NORMAL else echo "**************" echo "* N G  *" echo "**************" exit $ABEND fi

  • シェルスクリプトでmd5sum

    シェルスクリプトでmd5sumを計算して2つのファイルを比較しようとしています。 /bin/sh # ファイル名を出力 echo "fileout1_${file1DirFile}"→/var/log/httpd.log 入っています。 echo "fileout2_${file2DirFile}"→/root/httpd.log 入っています。 #-- MD5値取得 file1DirFileMD5=`md5sum ${file1DirFile} | awk '{printf("%s",$1)}'` file2DirFileMD5=`md5sum ${file2DirFile} | awk '{printf("%s",$1)}'` この後、ifで「file1DirFileMD5」と「file2DirFileMD5」比較。 <質問> #-- MD5値取得 の部分の下二行で、シェルスクリプトが止まります。 止まる原因が分からないのです。(処理が進まず、止まったままになります) 原因がわからず困っております。 別の書き方でも構わないので、解決方法はないでしょうか。 ご教授お願いします。

  • PHPでのsyntax errorについて

    こんにちは。今PHPによるサイト制作をしています。 今までちゃんとサイトが表示されていたのですが、 FTPでローカルのデータファイル全体をPUTしたところ、 サイト内で新着情報表示を使用しているページのみParse error: syntax error,が出てしまいます。 構文は一切変更をしていなかったため、原因がわかりません。 どなたかご教授頂けないでしょうか。 (下記、新着情報表示の構文) <table width="600" cellpadding="5" cellspacing="5" border="0"> <?php include("./inc/info.def.php"); ?> <?php $log = file(LOG_FILE); if (TOP_ROWS >= count($log)) { $END = count($log) - 1; } else { $END = TOP_ROWS - 1; } for($i=0;$i<=$END;$i++) { $DATA = _split($log[$i]); ?> <tr> <td> <?php if ($DATA['FILENAME']) { $SIZE = _calc_thumbnail($DATA['HEIGHT'],$DATA['WIDTH']); ?> <p class="news-photo"><a href="news.php?no=<?=$DATA['NO'];?>"><img src="<?=IMG_DIR.$DATA['FILENAME'];?>" border="0" width="<?=$SIZE['WIDTH'];?>" height="<?=$SIZE['HEIGHT'];?>" alt=""></a></p> <?php } ?> </td> <td nowrap valign="top" height="10"> <a href="news.php?no=<?=$DATA['NO'];?>"><font color="#cccccc"><span class="title-text"><?=$DATA['CAPTION'];?></span></font></a><br> <img src="img/blank.gif" alt="" width="1" height="5" border="0"><br> <p class="date-text"><font color="#cccccc"><?=date("Y年m月d日",$DATA['STAMP']);?></font></p> </td> </tr> <? } ?> </table> ---------------------------------------------------- 読み込んでいるinfo.def.phpの構文 <?php // 新着情報に関する設定 define("LOG_FILE","./inc/information.dat"); // ログファイル define("IMG_DIR","./up_img/"); // アップ画像保存場所 define("TOP_ROWS","5"); // トップページに表示する件数 define("LIST_ROWS","3"); // 1ページに表示するタイトル // 画像サイズに関する設定 define("IMG_H","600"); define("IMG_W","400"); define("THUMB_H","100"); define("THUMB_W","100"); // ログファイルを分解する関数 function _split($log='') { if (!$log) { return; } $data = split(",",$log); return array( 'NO' => $data[0], 'STAMP' => $data[1], 'CAPTION' => urldecode($data[2]), 'COMMENT' => urldecode($data[3]), 'FILENAME' => $data[4], 'HEIGHT' => $data[5], 'WIDTH' => ereg_replace("\n","",$data[6]) ); } ?> ---------------------------------------------------- よろしくお願い致します。

    • 締切済み
    • PHP
  • syntax errorの原因について

    Parse error: syntax error, unexpected ';' in C:\xampp\htdocs\meibo_kanri.php on line 101 と出てしまいますが、どこがダメなのかさっぱり分からず困っています。 コードは、次のようになります。 phpを知ってまだ一週間で、なかなか理解することができず、無知なひよっこです。 どうか、ご助力ください。 【コード】 <?php //セッション開始 session_start(); //データベース設定 $dbServer='localhost'; $dbUser='root'; $dbPass='1234'; $dbName='kadaitest_db'; $flag=TRUE; //フラグ変数の初期化 //データベース接続 if(!$link = mysql_connect($dbServer,$dbUser,$dbPass)){ $flag=FALSE; } else if(!mysql_set_charset('utf8',$link)){ //クライアント側の文字コードと、サーバ側の文字コードの設定 $flag=FALSE; } if($flag==TRUE){ //データベース選択 $db_selected = mysql_select_db($dbName, $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } /* //登録した内容の一覧表示 $result = mysql_query('SELECT id,name,date,address,tel,age FROM list'); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } while ($row = mysql_fetch_assoc($result)) { print('会員No:'.$row['no']); print(' 名前:'.$row['name']); print(' カナ:'.$row['kana']); print(' 生年月日:'.$row['birth']); print(' 入会日:'.$row['enter'].'<br/>'); } */ } else{ echo 'データベースエラー'; } ///////////////////////////////////////////////////// //////////////////////////// //入力した値の変数を設定 $in_no=$_POST['no']; $in_name=$_POST['name']; $in_kana=$_POST['kana']; $in_birth=$_POST['birth']; $in_enter=$_POST['enter']; /*新規登録 */ if($_POST['toroku']) { echo '<div class="kekka"><strong>【新規登録】</strong><br />'; //「会員No」を入力した場合 if($in_no){ //「会員No」に半角数字を入力した場合 if(ctype_digit($in_no)){ //「会員No」に5桁入力した場合 if(strlen($in_no)==5){ //クエリの作成 $sql = sprintf("INSERT INTO list (id,name,kana,birth,enter) VALUES ('%s','%s','%s','%s','%s')",mysql_real_escape_string($in_no),mysql_real_escape_string($in_name), mysql_real_escape_string($in_kana),mysql_real_escape_string($in_birth), mysql_real_escape_string($in_enter)); //クエリの実行 $result_flag = mysql_query($sql); if ($result_flag) { echo '以下の内容で登録しました。<br />'; } else { echo '<span class="err">登録が失敗しました。<br />'.mysql_error().'</span>'; } //「会員No」に5桁以外を入力した場合 } else { echo '<span class="err">登録が失敗しました。<br />「会員No」は5桁で入力してください。</span>'; } //「会員No」に半角数字以外を入力した場合 }else{ echo '<span class="err">登録が失敗しました。<br />「会員No」は半角数字で入力してください。</span>'; } //「会員No」を入力していない場合 }else{ echo '<span class="err">登録が失敗しました。<br />登録する会員Noが指定されていません。</span>'; } //入力内容の表示 echo '<br />■入力内容<br />'; echo '<span>会員No</span>:'.$in_no.'<br />'; echo '<span>名前</span>:'.$in_name.'<br />'; echo '<span>カナ</span>:'.$in_kana.'<br />'; echo '<span>生年月日</span>:'.$in_birth.'<br />'; echo '<span>入会日</span>:'.$in_enter.; echo '</div>'; //セッション終了 session_destroy(); } // 結果セットに関連付けられているリソースの開放 // これは、スクリプトが終了する際に自動的に実行されます。 //mysql_free_result($result); //メモリ開放(mysql_queryより得られた値) // DBリンクの切断 // これは、スクリプトが終了する際に自動的に実行されます。 $close_flag = mysql_close($link); ?>

    • ベストアンサー
    • PHP
  • bashスクリプト

    bashスクリプト #!/bin/bash if [ -f *.log ]; then  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi このようなスクリプトでecho ``(バックオート)でコマンドを実行できると思うんですが, tar czf $(date +"%Y_%m_%d").tar.gz *.log←これ自体を表示できないでしょうか? いまは,以下のようにしてコマンドを実行させ,さらに表示させています. これだとあまり賢くないというか,1行でスマートに表示させたいのですが, 可能でしょうか? if [ -f *.log ]; then  echo "tar czf $(date +"%Y_%m_%d").tar.gz *.log"  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi

  • シェルスクリプトで、サーバー監視

    まだまだスクリプト初心者なので、教えていただきたいのですが、 条件分岐させるifがあると思うのですが、 「サーバーのロードアベレージが1から2の時にトップを保存して、  2を超える時はサーバーを再起動させる。1以下の場合はログ保存する。」 というスクリプトを書きたいのです。 #!/bin/sh AVERAGE=` awk '{gsub(/[.]/,""); print $1}' /proc/loadavg` if [ $AVERAGE > 100 && $AVERAGE < 200 ] ;then top -b -n1 >> ./top if [ $AVERAGE -gt 200 ] ;then shutdown -r now end uptime >> ./top.log 上記のままだとerror: unexpected end of fileと エラーが出てしまいます。ifが2つ入ってるので 正しい記述が必要だと思うのですが、 どうしたらよいでしょうか

  • javascript関数の戻り値でphpの条件分岐

    こんばんは。 またまたプログラミングで詰まってしまいました・・・。 <?php    echo "<script> funcJS(); </script>"; //javascriptの関数。戻り値true/false    if(funcJS()の戻り値がtrueかどうか){       <~phpの処理~>     } ?> のようなプログラムがあったとして、funcJS()の戻り値の値によって、『phpの処理』を行うかどうかを決定したいのですがそのアルゴリズムが思いつきません。 色々と試行錯誤はやってみて、 (1)phpの変数にfuncJS()の戻り値を格納して、if文で条件分岐  $value = "<script> funcJS(); </script>";   しかし、これは$valueに戻り値を入れることができませんでした。 (2)javascript変数に戻り値を格納して、javascript内のif文で条件分岐 <?php    echo "<script> var value=funcJS(); </script>"; //javascriptの関数。戻り値true/false    echo "<script> if(value == 'true'){ </script>";       <~phpの処理~>    echo "<script> } </script>"; ?>  これも"}"がないと怒られてしまいました。 自分で思いつく限りは試してみたのですが、他に方法が思い浮かばず頭を抱えている状態です。 何か良い方法を知っている方、思いついた方、よろしくお願いします。