質問: dovecotプロセスの110ポート番号にncコマンドで接続し、その接続結果を基に真偽比較し、 dovecotプロセスを再起動させるスクリプトを作成中です。 ncコマンドではなく、PSコマンド実行結果判定でもいいのですが 今回の質問では、ncコマンドで実行結果を判定にしたいと思っています。 下記が作成中のスクリプトです スクリプト名はmonitor.shです ``` #!/bin/sh CHECK=DOVECOT DOVECOT_PORT=110 DEST=localhost dovecot_nc_result=`echo -n |/usr/bin/nc $DEST 110 |awk '{print $1,$2,$3}'` if [ $dovecot_nc_result -eq "+OK Dovecot ready." ]; then echo "OK" else /usr/bin/systemctl restart dovecot > /dev/null 2>&1 echo `date`|mail -s "alert ${DEST} ${CHECK} NG!" ${MAIL_TO} fi ``` 内容は、 ``` echo -n |/usr/bin/nc smail02.prod.carview.co.jp 110 |awk '{print $1,$2,$3}' +OK Dovecot ready. ``` ncコマンド実行結果の 「**+OK Dovecot ready.**」の文字列と IF文条件内で+OK Dovecot ready.文字列とを比較して 一致していれば、**echo "OK"** 不一致ならば、 **/usr/bin/systemctl restart dovecot** 実行するスクリプトになります。 +OK Dovecot ready. はあらかじめ、変数指定でもいいのかとは思っています --- sh -x monitor.shでテスト実行すると monitor.sh: 6 行: [: 引数が多すぎます となりますなります 6行目は if [ $dovecot_nc_result -eq "+OK Dovecot ready." ]; then になります。 この引数が多すぎますとなる解決をするにはどうすればいいのでしょうか また、IF文内で+OK Dovecot ready. の文字列比較する時の記述自体が誤りがあるのでしょうか ご教示頂けますと幸いです 宜しくお願いします
回答: `if [ "$dovecot_nc_result" = "+OK Dovecot ready." ]; then` です。 `[`コマンドの第一引数が`"+OK Dovecot ready"`で、第二引数が`=`で、第三引数が`"+OK Dovecot ready."`で、第一引数と第三引数が比較されます。 `if [ $dovecot_nc_result -eq "+OK Dovecot ready." ]; then` だと、変数を展開すると、 `if [ +OK Dovecot ready. -eq "+OK Dovecot ready." ]; then` になり、第一引数が`+OK`で、第二引数が`Dovecot`で、第三引数が`ready.`、(以下略)で、正しい`[`コマンドの構文になりません。 また、`-eq`は数値の比較演算子で、文字列の等値比較は`=`を使います。