【问题标题】:Using ZSH, how can I replace variables from a dictionary使用 ZSH,如何替换字典中的变量
【发布时间】:2016-12-15 12:35:54
【问题描述】:

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

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

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

由于 brew、pkg 和 apt-get 期望不同的包名,这在 1% 的情况下不起作用。例如,pkg 想要 dev/ruby 和 dev/ruby-gems; apt 想要 ruby​​-full,而 brew 只想要 ruby​​。

所以我需要一个子函数,将 $1 替换为平台正确的包名称,而不需要由较小的开关树组成的巨大开关树!我已经可以做到了,不仅不想写,而且我不想在添加新包时维护它......我宁愿拥有一个由行组成的纯文本“数据库”像这样的四个字段:

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

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

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

【问题讨论】:

    标签: shell installation zsh package-managers


    【解决方案1】:

    由于99% 的问题都可以通过一个简单的函数解决,因此您可能不想为 100 个不需要的情况中的 99 个创建“数据库”条目。对于 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是否存在,如果存在则返回索引的包名,否则只是通用名称,例如:

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

    然后您只需修改install() 函数以获取pkgs() 返回的内容,而不仅仅是"$1"

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

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

    sudo apt-get install ruby-full
    

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

    sudo apt-get install java
    

    【讨论】:

    • 这当然是一个开始,我什至没有想到将包名称简单地放在变量中......我目前正在遛狗,所以我不在家,但我会在下周后看看我是否可以完成这项工作。
    • 我试过了,但为了便于阅读,我重命名了 getPackage 的 pkgs() 函数似乎不起作用。 gist.github.com/tofagerl/628df7dd07ef47073cf808e85014b600 install ruby​​ 给出以下结果: 在 mac 上,'ruby' 在 ubuntu 上,'dev/ruby dev/ruby-gems' 在 freebsd 上,'ruby' 哦,并且在 mac 上不起作用,这就是我使用的原因命令 -v
    • 显然,我可以解压变量并使用 $pkg_ruby_brew、$pkg_ruby_apt 等等...但这太“蛮力”了 ;)
    • @tofagerl:从你的问题我读到你正在使用zsh。您的 github 脚本不起作用,因为那里使用了 bash。这里的区别在于zsh 中的数组元素通常以 1 开头,而其他 shell 中的 0bash,其中@987654338 的第一个参数@ 必须是 012
    • @tofagerl:您可以设置zshKSH_ARRAYS 选项以强制元素从零开始编号。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2020-02-29
    • 2022-01-10
    • 2021-10-27
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多