使用 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
我正在制作一个简单的 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