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,事情是这样的:您的假设是正确的,您绝对应该使用case语句而不是if--elif构造。优点之一是,将主机名与模式匹配还将为您解决完全限定主机名的问题。这是我的解决方案:

#!/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 命令。(另一个注意事项:尽量避免重复。最后执行一个find 命令可以让您在一个地方更改其其他参数。)。

于 2012-12-15T22:22:36.940 回答