我对编程很陌生。我正在尝试创建一个脚本,我将在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个案例,它将返回“未知主机名!” 我做错了什么? :(
感谢。
答案 0 :(得分: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变量的值。如果未找到特定匹配项,则匹配始终模式*)
将匹配,并且脚本将终止并显示错误消息(请注意,错误消息包含不匹配的主机名。这有时会保护很多工作; - ))。
如果一切顺利,最后会执行find命令。 (另一个注意事项:尽量避免重复。在最后执行一个 find命令可以在一个地方更改其他参数。)。