使用 ZSH,如何替换字典中的变量

Using ZSH, how can I replace variables from a dictionary

我正在制作一个简单的 install.zsh 来放入我的点文件。它主要用于安装 ruby-gems、npm、pip 等东西,然后我使用这些包管理器安装其余的东西。 但是为了达到那个水平,我仍然需要使用正确的平台相关语法来安装那些包管理器。更不用说所有仅在依赖于平台的包管理器中可用的东西了。

99% 的问题都可以使用像这样的简单函数解决:

install(){
  command -v brew && echo "installing  using Homebrew" && brew install ""
  command -v pkg && echo "installing  using pkg" && sudo pkg install ""
  command -v apt-get && echo "installing  using apt" && sudo apt-get install ""
}

1% 的时间这不会工作,因为 brew、pkg 和 apt-get 需要不同的包名。例如,pkg 想要 dev/ruby 和 dev/ruby-gems; apt 想要 ruby-full,而 brew 只想要 ruby。

所以我需要一个子函数,它用平台正确的包名称替换 $1,而无需由较小的开关树组成的巨大开关树!我已经可以做到这一点,不仅我不想写它,而且我不想在添加新包时维护它......我宁愿有一些像明文 "database" 组成的东西像这样的四个字段的行:

'ruby','ruby-full','dev/ruby,dev/ruby-gems',ruby

或者语法更好的东西,不是很重要。子功能更重要。

当然,如果我想在这里重新发明轮子,如果有人能给我指点一个轮子,那就更好了;)

由于 99% 的问题是使用一个简单的函数解决的,您可能不想为 100 例中的​​ 99 例创建 "database" 条目不需要。对于 1% 的例外情况,您可以 e. G。创建名为 pkgs_name 的数组(name 是 "stuff" 的通用名称) ,其中包含三个元素,[1] apt、[2] pkg 和 [3] brew 的不同的包名

pkgs_ruby=(ruby-full 'dev/ruby dev/ruby-gems' ruby)

然后一个函数,我们称它为pkgs(),通过包管理器的索引和东西的名称,可以检查数组pkgs_name 存在,如果存在 return 索引的包名,否则只是通用名称,如:

pkgs()
{
    eval echo ${pkgs_\[]-}
}

然后你只需要修改 install() 函数来获取 pkgs() return 而不是 "":

install()
{
  whence brew    && echo "installing  using Homebrew" &&      brew    install `pkgs 3 `
  whence pkg     && echo "installing  using pkg"      && sudo pkg     install `pkgs 2 `
  whence apt-get && echo "installing  using apt"      && sudo apt-get install `pkgs 1 `
}

因此,install ruby 将从 $pkgs_ruby 获取信息并执行 e。 g.

sudo apt-get install ruby-full

install java 没有任何定义将执行 e。 g.

sudo apt-get install java