0コメント

【Linux Ubuntu】マイクラサーバー内のチャットに反応して通知するシェルスクリプトを作ってみた

こにゃにゃちわ=^_^=

今回は自分でシェルスクリプトを書いてみました。

#!/usr/bin/bash
#一時間ごとに実行させる
text="#timestatus"
continue=3597

count=`grep -c ${text} '/home/nekoyama/デスクトップ/minecraft.java_server/logs/latest.log'`
count_temp=$count
time=0
while (( time < continue ));
      do
      count=`grep -c ${text} '/home/nekoyama/デスクトップ/minecraft.java_server/logs/latest.log' `
      if (( count != count_temp ));
          then
          script=`/home/nekoyama/デスクトップ/minecraft.java_server/time.sh`
          echo ${script}
          count_temp=$count
          fi
      sleep 1
      time=$((time+1))
      done
exit

これがいい経験になればいいんだけどねw
結果から言えば「サーバー内チャットに#timestatusと入力するとtime.shシェルスクリプトを実行する」
という結果になります。

time.shにはチャットに現在時刻を出力する内容になってます。

そのtime.shを呼び出しています。


〇text変数には「応答させる文字列」を入力
〇continueには「シェルスクリプトを継続させる時間」を入力(3600で一時間)
〇count=`grep -c ${text} '/home/nekoyama/デスクトップ/minecraft.java_server/logs/latest.log'`
serverフォルダのlogs/latest.logファイルにはマイクラサーバー内のログがリアルタイムで保存されます。
マイクラ内の何かをトリガーにするのであればこれを使うことでで作れると思います。覚えておくと便利かもしれない

で。

grepコマンドの-cオプションは「検知した${text}(今回は#timestatus)の「カウント回数」を出力」という事です。
三個文字列があれば3という値を出力するコマンドで、countに収納します。つまりcountはログファイルに存在する指定文字列カウント回数です。

time=0はC言語脳だから悩んでた時ふと入れたんだけどシェルスクリプトでは多分0になってる感じっぽいので不要かと。

〇while (( time < continue )); do ... done
大体はwhile [ $time -lt $continue ]; ...と入力すべきなんだろうが

演算子意味
数値1 -eq 数値2数値1と数値2が等しければ真
数値1 -ne 数値2数値1と数値2が等しくなければ真
数値1 -gt 数値2数値1が数値2より大きければ真
数値1 -lt 数値2数値1が数値2より小さければ真
数値1 -ge 数値2数値1が数値2以上であれば真
数値1 -le 数値2数値1が数値2以下であれば真

丸ごと引用してきましたが比較演算子オプションが全部アルファベットなの!!!

<とか!=とかの比較演算子のc言語がとてもありがたく思えるよ・・・
まあ速攻で覚えきれるわけもなく()
数値演算処理は大体$((変数とか四則演算子とか整数))で出来るので、こちらの条件式もこれに則ったタイプになります。


ちなみにwhile [ $time -lt $continue ]なら$time前空白とかwhile [...のwhile後空白とかが抜けるとエラーで動作しないです。やけに精密にできてる。

あとは
演算子意味
条件A -a 条件B条件Aかつ条件Bが真であれば、真
条件A -o 条件B
条件Aまたは条件B、どちらかが真であれば、真

C言語で言うif(A > 10 && B < 5);みたいな結合演算子。

とかもあります。

脱線しました。

あと
while 条件式; do 本文 done
if 条件式; than 本文 fi
としてdo...doneとかthan...fiで本文を囲う必要があるみたいなので注意

count=...とcount_temp=...が最初とwhileに入っているのは本実行部を見るとわかる通りで

if条件に「count != count_temp」であればtime.shスクリプトを実行するという形になっている通りで

前回実行時のcount_tempと今回実行時count取得で、同期を最初実行時に取った後
毎秒実行されるwhile文によりcount値が前回実行時より増えた場合、
新たに「#timestatus」と入力されたことを検知したという証拠になり、if文に入りスクリプトを実行する

という仕組みになってます。

script=...をechoの直前に入れているのは、最初入れておくとなんかバグって動作しなかったからです。何故かは不明

でそれらが終わったら今回の結果をcount_tempに保存し

1秒休んで

timeも加算し

3597回実行し3597秒経過したら

終わり。


3597にしてるのは(59分56秒)crontabで毎時間ごとに実行させるようにして常に受け付けるのですが次crontab実行時に3600にしてると干渉する可能性があるので余裕を持たせて終了させた、という感じになります。

てか59にして毎分実行させた方がよかったのかもしれないけど、まあよく分からんので()


とまあ、こんな感じ。

実行するスクリプトとtext変数値だけ変えれば別の文字列で別のシェルスクリプトを実行できるシェルスクリプトが簡単に完成するので使いまわしやすいね

というわけで


今回if文とかwhile文とかの役割についてはC言語の基礎を勉強してたから分かったものの記述方法が分からずエラー連発だったのでそこらで調べたこと以外は特に引用元もなく、自分でシェルスクリプトを組み立てられた。

とはいえ簡単なものだけどね。


「マイクラのチャットに反応してシェルスクリプトを実行する」

ってのはまだ出ていなかったのかもしれない


まあ今日はこれくらいで

(^o^)ノ < おやすみー

この記事へのコメント