Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用ZSH,如何替换字典中的变量_Shell_Installation_Zsh_Package Managers - Fatal编程技术网

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

Shell 使用ZSH,如何替换字典中的变量,shell,installation,zsh,package-managers,Shell,Installation,Zsh,Package Managers,我正在做一个简单的install.zsh来放入我的dot文件。它主要用于安装ruby gems、npm、pip等东西,然后我使用这些包管理器安装其余的东西。 但是为了达到这个级别,我仍然需要使用正确的平台相关语法安装那些包管理器。更不用说那些只在依赖于平台的包管理器中可用的东西了 99%的问题通过使用以下简单函数解决: install(){ command -v brew && echo "installing $1 using Homebrew" && br

我正在做一个简单的
install.zsh
来放入我的dot文件。它主要用于安装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"
}
1%的情况下,由于brew、pkg和apt需要不同的packagenames,此功能无法正常工作。例如,pkg需要dev/ruby和dev/ruby gems;apt需要ruby full,brew只需要ruby

所以我需要一个子函数,它用平台正确的包名替换$1,而不需要由较小的开关树组成的巨大开关树!我已经可以这样做了,我不仅不想写它,而且不想在添加新包时维护它。。。我更希望有一个由四行字段组成的纯文本“数据库”,如下所示:

'ruby','ruby-full','dev/ruby,dev/ruby-gems',ruby
或者语法更好的东西,这不是很重要。子功能更重要

当然,如果我想在这里重新发明车轮,如果有人能给我指一个车轮工人,那会更好;)

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

pkgs_ruby=(ruby-full 'dev/ruby dev/ruby-gems' ruby)
然后,一个函数,我们称之为
pkgs()
,传递了包管理器的索引和文件名,可以检查数组pkgs名称是否存在,如果存在,则返回索引的packagename,否则只返回泛型名称,如:

pkgs()
{
    eval echo \${pkgs_$2\[$1]-$2}
}
然后,您只需修改
install()
函数,以获取
pkgs()
返回的内容,而不仅仅是
“$1”

因此,
installruby
将从
$pkgs\uruby
获取信息并执行e。g

sudo apt-get install ruby-full
sudo apt-get install java
而没有任何定义的
install java
将执行e。g

sudo apt-get install ruby-full
sudo apt-get install java

这当然是一个开始,我甚至没有想到简单地将包名放入变量中。。。我现在在看管狗,所以我不在家,但下周我会看一看我是否能做到这一点。我试过了,但pkgs()函数似乎不起作用,我将其重命名为getPackage以便于阅读。安装ruby会得到以下结果:在mac上,ubuntu上的“ruby”,freebsd上的“dev/ruby dev/ruby gems”,ruby“哦,这就是为什么我在mac上不工作,这就是为什么我使用命令的原因——顺便说一句,我可以解压变量并使用$pkg_ruby_brew、$pkg_ruby_apt等等。。。但这真是“蛮力”;)@托法格尔:从你的问题中我知道你在使用
zsh
。您的github脚本无法工作,因为那里使用了
bash
。这里的区别是
zsh
中的数组元素通常从1开始编号,而其他shell中的数组元素是
bash
,其中
getPackage()
的第一个参数必须是0、1或2。@ToFagel:您可以设置
zsh
KSH\u数组
选项强制元素从零开始编号。