我有一个 rsync 脚本,位于各个服务器上。我没有考虑针对每个虚拟机的具体情况重新编写它,而是为具体情况创建其他脚本并使用source
.我想过将其放入source
这样if
的声明中;
# Check for Atlassian Apps
if [[ "$SERVER_NAME=crowd.server.com" ]]; then
# call crowd-bkup.sh
echo -e "\e[1mCrowd backup running ...\e[0m"
SCRIPTDIR=$(dirname "$0")
# shellcheck source=src/crowd-bkup.sh
# shellcheck disable=SC1091
source "${SCRIPTDIR}/crowd-bkup.sh"
我的问题是如何为 Confluence、Jira 服务器等添加更多内容?是否可以在不添加加载更多语句的情况下添加它们if
?
答案1
[[ "$SERVER_NAME=crowd.server.com" ]]
始终为真(它测试是否$SERVER_NAME=crowd.server.com
扩展为非空字符串)。你的意思是[[ "$SERVER_NAME" = "crowd.server.com" ]]
。
如果你想对不同的服务器名称执行不同的处理,那么你可以使用case
:
case "$SERVER_NAME" in
crowd.server.com)
echo -e "\e[1mCrowd backup running ...\e[0m"
…
;;
jira.server.com)
echo -e "\e[1mJira backup running ...\e[0m"
…
;;
…
esac
如果要对多个名称执行相同的命令,可以使用以 分隔的多个模式|
。您可以在模式中使用 shell 通配符,例如
case "$SERVER_NAME" in
crowd.server.com|jira.server.com)
echo -e "\e[1mBackup running in ${SERVER_NAME%.*}...\e[0m"
…
;;
*.mysubdomain.server.com)
echo -e "\e[1mBackup running in mysubdomain...\e[0m"
…
;;
…
esac
答案2
您可以使用数组并将 if 包装在 for 循环内来实现:
#!/bin/bash
names=( crowd horde host army pack )
for n in "${names[2]}"; do
# Check for Atlassian Apps
if [[ "$SERVER_NAME=crowd.server.com" ]]; then
# call "${n}-bkup.sh"
echo -e "\e[1m$n backup running ...\e[0m"
SCRIPTDIR=$(dirname "$0")
# shellcheck source="src/$n-bkup.sh"
# shellcheck disable=SC1091
source "${SCRIPTDIR}/$n-bkup.sh"
done
或者,使用位置参数:
set -- crowd horde host army pack
for $n; do
.....
done