使用源调用其他脚本并使用 if 语句设置调用条件

使用源调用其他脚本并使用 if 语句设置调用条件

我有一个 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

相关内容