首页 > 解决方案 > shell脚本中的一对一映射

问题描述

我正在迁移过程中。从旧组服务器迁移到新组服务器,其中 2 组之间的服务器名称没有逻辑关系。我有一个在旧服务器上运行的脚本,获取所有必要的备份并运行另一个脚本以将备份复制到新服务器并执行它。

如果我可以包含将旧服务器映射到新服务器的逻辑,我可以组合这两个脚本(备份并复制到新服务器)。有没有办法我可以做到这一点。

Old server   New server

King          Queen
Bat           Ball
water         fire
sand          rock

我期望的是,如果脚本在服务器“King”上运行,我希望脚本识别相应的新服务器是“Queen”并将备份复制到 Queen。

标签: pythonshellunixconditional-statements

解决方案


使用 bash 关联数组:

#!/usr/bin/env bash
declare -A renames=( [King]=Queen [Bat]=Ball [water]=fire [sand]=rock )
hostname=$(hostname)

if [[ ${renames[$hostname]} ]]; then
  echo "The current host, $hostname, is being renamed to ${renames[$hostname]}"
fi

或者使用运行 case 语句的简单函数,从而与所有POSIX shell 兼容:

newName() {
  case $1 in
    King)  echo "Queen" ;;
    Bat)   echo "Ball" ;;
    water) echo "fire" ;;
    sand)  echo "rock" ;;
    *)     return 1 ;;
  esac
}

if dest=$(newName "$hostname"); then
  echo "Name $hostname is being renamed to $dest"
fi

或者带有一系列前缀变量:

rename_King=Queen
rename_Bat=Ball
rename_water=fire
rename_sand=rock

var="rename_$hostname"
if [[ ${!var} ]]; then
  echo "$hostname is being renamed to ${!var}"
fi

或使用目录:

renameDir=/path/to/renames
if [[ -e "$renameDir/$hostname" ]]; then
  echo "Renaming $host to $(<"$renameDir/$hostname")"
fi

或扫描文件并找到第一个匹配项:

if dest=$(awk -v search="$hostname" '$1 == search { print $2; exit; }' <input) && [[ $dest ]]; then
  echo "Renaming $hostname to $dest"
fi

……等等,等等。


推荐阅读