0

私はプログラミングにまったく慣れていません。3台のサーバーで実行するスクリプトを作成しようとしています。このスクリプトはホスト名を取得してから、適切なコマンドを実行する必要があります。方法はわかりませんが、「ケース」を使用する必要があると思います。これが私のコードです。

#!/bin/bash

#Get hostname
hostname="$HOSTNAME"

PATH_DEV="some_path"
PATH_PREPROD="some_path"
PATH_PROD="some_path"

if [ $hostname == "dev" ];
then 

    find $PATH_DEV -name '*.mysql.gz' -type f -mtime +7 -exec rm -rf '{}' \;

elif [ $hostname == "prod" ];

then 

    find $PATH_PROD -name '*.mysql.gz' -type f -mtime +7 -exec rm -rf '{}' \;

elif [ $hostname == "preprod" ];

then

    find $PATH_PREPROD -name '*.mysql.gz' -type f -mtime +7 -exec rm -rf '{}' \;

else 

echo "Unknown hostname!";

fi

「dev」でのみ実行されます。他の2つのケースでは、「不明なホスト名!」が返されます。私が間違っているのは何ですか?:(

ありがとう。

4

1 に答える 1

0

さて、あなたの主な質問はすでにコメントでちょっと答えられています。しかし、おそらくより適切に使用すると述べたようcaseに、ここに問題があります。仮定は正しいので、---constructの代わりにステートメントを使用する必要がありcaseます。利点の1つは、ホスト名をパターンと照合することで、完全に修飾されたホスト名の問題も解決されることです。これが私の解決策です:ifelif

#!/bin/bash
PATH_DEV="some_path"
PATH_PREPROD="some_path"
PATH_PROD="some_path"

case "$HOSTNAME" in
  dev|dev.*)
    PATH_TO_USE="$PATH_DEV"
    ;;
  prod|prod.*)
    PATH_TO_USE="$PATH_PROD"
    ;;
  preprod|preprod.*)
    PATH_TO_USE="$PATH_PREPROD"
    ;;
  *)
    echo "Unknown hostname: $HOSTNAME"
    exit 1
    ;;
esac
find "$PATH_TO_USE" -name '*.mysql.gz' -type f -mtime +7 -exec rm -rf '{}' \;

caseステートメントは$HOSTNAMEの値を評価し、それが「dev」であるか「dev。」で始まるか、「prod」であるか「prod。」で始まるか、「devprod」であるか「devprod」で始まるかをチェックします。 。」それぞれ。一致すると、変数PATH_TO_USEが対応するPATH_XXX変数の値に設定されます。特定の一致が見つからない場合、match-always-pattern*)が一致し、スクリプトはエラーメッセージで終了します(エラーメッセージには一致しないホスト名が含まれていることに注意してください。これにより、多くの作業が安全になる場合があります;-))。

すべてがうまくいけば、最後にfindコマンドが実行されます。(別の注意:可能な限り重複を避けるようにしてください。最後に1つの検索コマンドを実行すると、他のパラメーターを1か所で変更できます。)

于 2012-12-15T22:22:36.940 に答える