40
my-fish-script a b c d

假设您想从第二个参数开始获取所有参数,所以b c d.

在 bash 中,您可以使用shift转储第一个参数并使用"$@".

您将如何使用鱼壳解决问题?

4

3 回答 3

65

在鱼中,您的论点包含在$argv列表中。使用列表切片访问一系列元素,例如$argv[2..-1]返回从第二个到最后一个的所有参数。

例如

function loop --description "loop <count> <command>"
  for i in (seq 1 $argv[1])
    eval $argv[2..-1]
  end
end

用法

$ loop 3 echo hello world
hello world
hello world
hello world
于 2014-06-07T04:30:25.627 回答
25

命令的行为shift可以用 来模拟set -e/--erase VARIABLE_NAME

这个想法是删除第一个参数,然后从$argv列表中获取剩余的参数。

例如

function loop  --description "loop <count> <command>"
  set count $argv[1]
  set --erase argv[1]
  for i in (seq 1 $count)
    eval $argv
  end
end

用法

$ loop 3 echo hello world
hello world
hello world
hello world
于 2014-06-07T20:14:56.583 回答
12

您还可以使用 read 在我看来更具可读性:

function loop
  echo $argv | read -l count command
  for i in (seq 1 $count)
    eval $command
  end
end

这更有效,尤其是当您想使用比第一个参数更多的参数时。

echo $argv | read -l first second rest
于 2014-06-09T15:30:18.853 回答