AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 716850
Accepted
Richie Thomas
Richie Thomas
Asked: 2022-09-11 12:54:33 +0800 CST2022-09-11 12:54:33 +0800 CST 2022-09-11 12:54:33 +0800 CST

Fish shell - 用于创建检查值数组的 switch 语句的语法

  • 772

我正在研究 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 行的语法相匹配。barbazcase ${commands[*]}

我在其中执行脚本的外壳是 zsh v5.8.1,但是我的 shebang 专门引用了“鱼”外壳,所以我认为我的外壳无关紧要。我已经安装了鱼 v3.5.1,fwiw。

fish
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2022-09-11T13:31:43+08:002022-09-11T13:31:43+08:00

    里面的bash代码是:

    commands=(`rbenv-commands --sh`)
    

    这是应用于输出的 split+globrbenv-commands --sh以及分配给$commands bash数组元素的结果单词

    case "$shell" in
    fish )
      cat <<EOS
    function rbenv
      set command \$argv[1]
      set -e argv[1]
      switch "\$command"
      case ${commands[*]}
        rbenv "sh-\$command" \$argv|source
      case '*'
        command rbenv "\$command" \$argv
      end
    end
    EOS
      ;;
    

    cat << EOS...输出一些fish代码,但由于EOS未引用,因此仍会执行扩展(通过 bash)。除非前面有反斜杠,否则$param扩展bash. 您会注意到大多数$s 都以 a 为前缀\,但不是${commands[*]}(无论如何这是 Korn shell 语法,而不是 fish 语法)。这由 bash 扩展为与(默认为空格)$commands的第一个字符连接的数组元素。$IFS

    所以该cat命令产生的鱼代码很像:

    function rbenv
      set command $argv[1]
      set -e argv[1]
      switch "$command"
      case elements of the commands bash array
        rbenv "sh-$command" $argv|source
      case '*'
        command rbenv "$command" $argv
      end
    end
    

    要检查字符串是否在列表中,您可以使用fish's containsbuitin:

    set list foo bar baz
    set string foo
    if contains -- $string $list
      echo $string is in the list
    end
    

    (如 zshif (( $list[(Ie)$string] ))或非空列表if [[ $string = (${(~j[|])list}) ]])

    你也可以这样做:

    switch $string
      case $list
        echo $string matches at least one of the patterns in the list
    end
    

    (这是不一样的,除非列表中的任何元素都不包含*或?字符)

    (这更像是zsh's [[ $string = (${(j[|])~list}) ]](对于非空列表))。

    还有:

    if string match -q -- $pattern $list > /dev/null
      echo at least one of the elements of the list matches $pattern
    end
    

    (如zsh's if (( $list[(I)$pattern] )))。

    • 2

相关问题

  • 在鱼壳中设置默认解释器

  • 类型强制 PATH 搜索的问题

  • 在fish中定义函数,与watch一起使用

  • 终端提示中有一个神秘的[I]

  • 如何在fish中的if语句中对多个条件进行分组

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve