変数にデフォルト値を設定する

変数にデフォルト値を設定する

以前書いた記事(差分更新されたファイルのみを同期するシェルスクリプト)ではdiffコマンドの戻り値から条件分岐しrsyncコマンドにより同期させるシェルをご紹介しました。(続きになりますのでまだ見ていない方は先にご覧ください)

しかし、とっても気持ち悪いことを未解決にさせたままでした。
それは、、、

この文言。

diff_unix_sed.sh: 8 行: [: -eq: 単項演算子が予期されます
diff_unix_sed.sh: 39 行: [: -eq: 単項演算子が予期されます

今回のシェルでは特に影響は無いですが紛れもない不具合です。

①2行目を処理
シェルの該当箇所を抜粋しますが

if [ ${EDCODE} -eq 0 ] ; then
PASSCODE=0

この部分です。
シェルの最後にエラー判定をさせたいがために苦し紛れの記述になりましたが結果としてエラーとなります。
しかも全く的外れな内容です。

そもそも戻り値0の場合の条件分岐自体が不必要なので削除しました。
それがこちら

  if [ ${EDCODE} -eq 1 ] ; then
    rsync ${DRY} -av –checksum ${SRC} ${DST}
    EDCODE=$?
      if [ ${EDCODE} -ne 0 ] ; then
        echo “同期に失敗しました”
        logger “ERROR 同期に失敗しました”
      fi
  elif [ ${EDCODE} -eq 2 ] ; then
    echo “コマンドエラーが発生しました”
    logger “ERROR コマンドエラーが発生しました”
    EDCODE=1
  else
    echo “差分はありませんでした”
  fi

②1行目を処理
ここは引数に1を入れた場合にrsyncをテスト実行させたいがために入れたものですが、引数を指定しない場合変数$1はnullになるのでエラーとなっています。
どうすればいいか悩みましたが解決策は非常に単純なものでした。

変数$1にデフォルト値として0を指定してあげればよかったのです。
つまり、修正後はこうなります。

# 引数1の時テスト実行
if [ ${1:-0} -eq 1 ] ; then
  DRY=–dry-run
fi
変数をコロンで区切り、$1がnullの場合に0を代入する-を付けてこのように記述します。
すると、シェル実行時に引数を指定しなければ$1はnullとなり、デフォルト値の設定により$1=0となります。①②を修正し、差分無しの場合に引数無しでシェルを実行してみると、

このようにエラーがなくなってスッキリ。(見やすいようにオプション有り無しでまとめました)

最後に完成したシェルを記載して終わりにします。

#!/bin/bash
# 変数指定
SRC=/home/test.txt
DST=/home/task/test.txt
# 引数1の時テスト実行
if [ ${1:-0} -eq 1 ] ; then
  DRY=–dry-run
fi
# 処理実行
diff ${SRC} ${DST}
EDCODE=$?
  if [ ${EDCODE} -eq 1 ] ; then
    rsync ${DRY} -av –checksum ${SRC} ${DST}
    EDCODE=$?
      if [ ${EDCODE} -ne 0 ] ; then
        echo “同期に失敗しました”
        logger “ERROR 同期に失敗しました”
      fi
  elif [ ${EDCODE} -eq 2 ] ; then
    echo “コマンドエラーが発生しました”
    logger “ERROR コマンドエラーが発生しました”
    EDCODE=1
  else
    echo “差分はありませんでした”
  fi
# エラー判定
if [ ${EDCODE} -eq 0 ] ; then
  echo “処理正常終了”
  logger “INFO 処理正常終了”
  exit 0
fi
if [ ${EDCODE} -eq 1 ] ; then
  echo “処理異常終了”
  logger “ERROR 処理異常終了”
  exit 1
fi

ITカテゴリの最新記事

%d人のブロガーが「いいね」をつけました。
TOP