【问题标题】:one to one mapping in shell script [closed]shell脚本中的一对一映射[关闭]
【发布时间】:2018-12-12 19:21:26
【问题描述】:

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

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

Old server   New server

King          Queen
Bat           Ball
water         fire
sand          rock

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

【问题讨论】:

  • ...好吧,这就是你想要做的;您在尝试使用 bash-the-language 时遇到的具体问题是什么?
  • 如果问题只是“我如何存储这个映射?”,这很开放——哎呀,你可以有一个目录,其中每个文件都是旧主机名,其内容是新主机名;或者你可以有一个associative array,其中键是旧名称,值是新名称;或者你可以有一个前缀变量命名空间做同样的事情;或者......好吧,可能的方法的数量是无穷无尽的;这里没有真正的特异性
  • 我正在寻找一些可以在脚本中加入这个条件/映射的东西。就像我需要在脚本中使用数组或使用单独的 awk 脚本来替换新旧服务器
  • 有几乎无数种方法来解决这个问题。您能否提供一些您尝试过的代码示例?此外,您同时标记了 pythonshell。它是哪一个?这两种语言不是很相似。
  • 对于一种启动方式,在 shell 脚本中,创建一个给定名称将返回新名称的函数。在该函数中,编写一个 case 语句,为匹配的输入返回正确的名称。

标签: python shell unix conditional-statements


【解决方案1】:

使用 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

...等等,等等。

【讨论】:

  • 我可以在声明期间从输入文件(2列)中读取它
  • 当然。如果这是你想要的,应该把它放在问题中。 (不过,我要去吃午饭了,所以暂时不会修改)。
  • 我可以使用case语句,因为我用过它。但是由于这些服务器超过50台,我将探索如何使用输入文件中的case语句。谢谢!
  • @MO12 该输入文件的格式将是您问题的重要部分。
  • @BenjaminW。它与我在原始问题中提到的格式相同
猜你喜欢
  • 2021-05-22
  • 2013-08-11
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
相关资源
最近更新 更多