我正在研究 RBENV 代码库,我看到在文件的第 116 行rbenv-init
,创建了一个包含switch
语句的函数。我的假设是我们检查变量的值是否是(复数)变量command
中值数组的成员之一。commands
如果是,我们执行 switch 语句的分支 1。否则,我们执行分支 2。
我想写一个简单的脚本来测试我的假设,所以我写了以下内容:
#!/usr/bin/env fish
set command "foo"
switch $command
case ${argv[*]}
echo "command in args"
case "*"
echo "command not found"
end
但是,当我运行此脚本时,出现以下错误:
$ ./foo bar baz
./foo (line 6): ${ is not a valid variable in fish.
case ${argv[*]}
^
warning: Error while reading file ./foo
我期待评估一个包含andargv
的数组,因为这是我提供给脚本的两个参数。我的语法与源代码(即)中第 117 行的语法相匹配。bar
baz
case ${commands[*]}
我在其中执行脚本的外壳是 zsh v5.8.1,但是我的 shebang 专门引用了“鱼”外壳,所以我认为我的外壳无关紧要。我已经安装了鱼 v3.5.1,fwiw。
里面的bash代码是:
这是应用于输出的 split+glob
rbenv-commands --sh
以及分配给$commands
bash
数组元素的结果单词cat << EOS...
输出一些fish
代码,但由于EOS
未引用,因此仍会执行扩展(通过 bash)。除非前面有反斜杠,否则$param
扩展bash
. 您会注意到大多数$
s 都以 a 为前缀\
,但不是${commands[*]}
(无论如何这是 Korn shell 语法,而不是 fish 语法)。这由 bash 扩展为与(默认为空格)$commands
的第一个字符连接的数组元素。$IFS
所以该
cat
命令产生的鱼代码很像:要检查字符串是否在列表中,您可以使用
fish
'scontains
buitin:(如 zsh
if (( $list[(Ie)$string] ))
或非空列表if [[ $string = (${(~j[|])list}) ]]
)你也可以这样做:
(这是不一样的,除非列表中的任何元素都不包含
*
或?
字符)(这更像是
zsh
's[[ $string = (${(j[|])~list}) ]]
(对于非空列表))。还有:
(如
zsh
'sif (( $list[(I)$pattern] ))
)。