2017-11-01 11 views
1

私は理解していないことだけで簡単に質問します。すべてがうまくいきます - 私は何かの周りに頭を抱えようとしています。Bashループでの問題

私は1日1回のdnsmasqを再起動している非常に単純なbashスクリプトがあります。

LogFile="/var/log/logfile" 
declare -a CMD_AR=() 
declare -a ECHO_OUT=(stopping starting) 
STOP=$(service dnsmasq \stop) 
SLEEP=$(\sleep 15) 
START=$(service dnsmasq \start) 
CMD_AR+=($STOP) 
CMD_AR+=($START) 

z=0 
while [[ $z -le 1 ]]; do 
     DT=`date +%c` 
     echo "$DT - ${ECHO_OUT[$z]} dnsmasq..." >> ${LogFile} 
     eval ${CMD_AR[$z]} >> ${LogFile} 2>&1 
     unset DT 
     eval ${SLEEP} 
     z=$[$z+1] 
done 

をそう...この作品は、しかし、DT変数が変わることはありません。だから私のログファイルは読み取ります

Tue 31 Oct 2017 10:57:07 PM MDT - stopping dnmasq 
Tue 31 Oct 2017 10:57:07 PM MDT - starting dnmasq 

は、時刻文字列は、少なくとも15(睡眠の値15)秒異なることはないでしょうか?なぜループがDT変数を再計算していないのか理解できません。誰ですか?

また、私は自分のコードについても何か提案をしていきます。私はスクリプティングに関しては完全にハックしています。

+0

[[$ z -l e1]];あなたがこれを意図的なものにしている間に、意図的に避けることができるこの意図的なものであるかどうかを知るために、BTW SLEEP = $(\ sleep 15)=> SLEEP = "sleep 15" –

答えて

3

問題は、この行である:コマンドsleep 15ので、ヌル文字列にSLEEP変数を設定

SLEEP=$(\sleep 15) 

は出力を生成しません。あなたの問題を解決するため

SLEEP="sleep 15" 

:へ

変更に。

ライン

START=$(service dnsmasq \start) 

は同じ問題を抱えています。


スクリプトが複雑すぎて、shellcheckでチェックされているようです。一般的に、コマンドを変数に格納してeval - BashFAQ/050を参照して実行することはお勧めできません。あなたのコードは、このように書き換えることができます:行わ

LogFile="/var/log/logfile" 
z=0 
while ((z <= 1)); do 
    if ((z == 0)); then 
     echo "$(date) - stopping dnsmasq..." >> "${LogFile}" 
     service dnsmasq stop >> "${LogFile}" 2>&1 
    else 
     echo "$(date) - starting dnsmasq..." >> "${LogFile}" 
     service dnsmasq start >> "${LogFile}" 2>&1 
    fi 
    sleep 15 
    ((z++)) 
done 

改良:

  • 使用((..))
  • を分割算術演算とチェック
  • 単語を防ぐために、二重引用符でラップ変数の間接実行を削除しますeval
  • アレイを削除する - ここでは不要です
  • コードを読みやすくする

ループはここでは不要です。このコードはおそらくもっと簡潔に書くことができます:

LogFile="/var/log/logfile" 
exec >"$LogFile" 2>&1 
echo "$(date) - stopping dnsmasq..." 
service dnsmasq stop 
sleep 15 
echo "$(date) - starting dnsmasq..." 
service dnsmasq start 
+1

配列は本当にそれをするだけでした - それは私のスクリプトにあるわけではないので、すでに配列を定義しましたが、間違いなく過剰です。 私はevalを使用することをお勧めしました。実際には、元々 "service dnsmasq restart"していましたが、動作していたときにログに "bad command"というエラーメッセージが表示されることがありました。とにかく 、助けてくれてありがとう - 私が言ったように、私は初心者くさい -Josh –

+0

ああだ、とexecコマンドをありがとう - それは素晴らしい だとshellcheck :) –

+0

それが助けうれしいです。 [誰かが私の質問に答えるときにどうするか](https://stackoverflow.com/help/someone-answers)。 – codeforester