如何测试 fish shell 中的 argv 计数和 argv[1] 的值?

How to test for argv count and value of argv[1] in fish shell?

我正在尝试测试 $argv 的长度或函数中第一个 $argv[1] 元素的值,如下所示:

function do-something
  if test (count $argv) -lt 2 -o $argv[1] = "--help"
    echo Usage ...
  end
end

但是,我收到以下错误:

⟩ do-something 
test: Missing argument at index 6

问题出在字符串比较上,但我不确定如何让它工作。我也试过 -o [ $argv[1] = "--help" ],但由于另一个错误而失败。

另请注意,如果我包含一个参数,这将起作用,因此即使第一个条件失败,fish 似乎也在评估第二个条件。这是一个错误吗?

问题是 (count $argv)$argv[1] 都同时展开,因为它们都是同一命令的参数,如果未设置 $argv[1] 则为空。因此,如果没有参数,test 会看到:

if test (count) -lt 2 -o = "--help"

导致错误。

解决此问题的最简单方法是引用 $argv[1]:

if test (count $argv) -lt 2 -o "$argv[1]" = "--help"

引号确保 "$argv[1]" 扩展为一个参数(空字符串)而不是没有参数。

另一种方法是使用两个单独的命令:

function do-something
  if test (count $argv) -lt 2; or test $argv[1] = "--help"
    echo Usage
  end
end

第二个 test 只有在第一个成功时才会执行。