如何访问fish脚本中的剩余参数

Den*_*nis 28 fish

my-fish-script a b c d
Run Code Online (Sandbox Code Playgroud)

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

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

你会如何使用鱼壳解决问题?

Den*_*nis 52

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

例如

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

用法

$ loop 3 echo hello world
hello world
hello world
hello world
Run Code Online (Sandbox Code Playgroud)

  • @AliGajani我做到了.这是我的一个问题,我找不到SO的答案,所以我现在加入它来帮助别人.事实上,[SO鼓励您回答自己的问题](http://stackoverflow.com/help/self-answer). (2认同)

Den*_*nis 22

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
Run Code Online (Sandbox Code Playgroud)

用法

$ loop 3 echo hello world
hello world
hello world
hello world
Run Code Online (Sandbox Code Playgroud)

  • 如果有人在想,我[回答两次,因为答案是截然不同的](http://meta.stackexchange.com/a/25210/253951).通过这种方式,社区可以决定哪个答案更好,并且可以轻松评论不同的答案. (4认同)

ter*_*rje 11

您也可以使用我认为更具可读性的阅读:

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

这样可以更好地工作,尤其是当您想要使用多于第一个参数时.

echo $argv | read -l first second rest
Run Code Online (Sandbox Code Playgroud)