如何检测鱼壳中的argv计数和argv [1]的值?

Dal*_*las 5 fish

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

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

但是,我收到以下错误:

? do-something 
test: Missing argument at index 6
Run Code Online (Sandbox Code Playgroud)

问题在于字符串比较,但是我不确定如何使它起作用。我也尝试过-o [ $argv[1] = "--help" ],但这失败了,并出现另一个错误。

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

rid*_*ish 6

问题是,(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"
Run Code Online (Sandbox Code Playgroud)

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

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

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

test仅当第一个成功时,第二个才会执行。