【问题标题】:Zipping for loop in fish shell (loop over multiple lists)在鱼壳中压缩 for 循环(循环多个列表)
【发布时间】:2018-01-03 08:35:06
【问题描述】:

我经常在命令行中直接编写临时循环来运行一堆实验。它总是一次性的,因此为其编写脚本文件是不必要的开销。

不过,我通常想压缩一堆参数,我想运行一个类似于以下的命令:

for arg1,arg2 in 256,lol 128,foo 32,bar
    ./bla --many-flags --name $arg2 --something $arg1
end

我可以使用string(或旧版本中的tr delim \n)实现类似但非常脆弱的鱼,如下所示:

for exp in 256,lol 128,foo 32,bar
    ./bla --many-flags --name (string split ',' $exp)[2] --flag (string split ',' $exp)[1]
end

我想知道有谁知道更好的方法,不需要每次使用参数时都需要繁琐的子命令(一个参数甚至可以多次使用),更糟糕的是,任意分隔符会导致各种问题?

理想情况下,我什至可以像这样将它用作let

for arg1,arg2 in 256,lol
    ./bla --many-flags --ame $arg2 --something $arg1
end

【问题讨论】:

  • 这个问题的实际输入是什么?它是逗号分隔对的列表吗?可能是 2 个列表,{256,128,32) 和 {lol,foo,bar} 迭代列表的索引?
  • 分配逗号分隔对的字段的一种技术是string split , $exp | begin; read arg1; read arg2; end - 现在您可以在变量中拥有值以供重用。
  • @glennjackman 接近但string split ',' $exp | read var1 var2,不需要begin。我认为这是最好的。
  • 它是用于交互式使用,循环实验配置,在最一般的情况下是一个元组列表,可以表示元组,但是我选择表示它们,即我不关心如何。 read ... 块是一个非常好的主意,并且朝着我所希望的方向走了很长一段路。 @ridiculous_fish:我无法让您使用较短的示例,var2 总是空的。不过,它确实适用于@glenn-jackman 的开始/结束块语法。我可以接受这个作为答案,尤其是 @ridiculous_fish 说这是最好的答案:)
  • 似乎read 现在有-d DELIM 选项,所以以下内容略短:echo $exp | read -d , var1 var2 并且确实有效,而荒谬的鱼在我尝试时总是将 var2 留空。

标签: shell loops fish


【解决方案1】:

根据问题上的 cmets,这是不支持的。最接近的解决方法似乎是:

for exp in 256,lol 128,foo 32,bar
    echo $exp | read -d , arg1 arg2
    ./bla --many-flags --name $arg2 --flag $arg1
end

对于常规的交互式使用来说不太令人满意,但我想我会挺过来的。

【讨论】:

  • pasteseqpsub 的组合可以实现例如编号条目:for tuple in (paste -d ',' (seq 1 5 | psub) list-of-files.txt); echo $tuple | read -d ',' i file; echo $i $file; end.
  • 请注意我是如何提到我要求交互式使用的,因此您的评论根本没有解决我的用例。虽然也许它可以帮助我猜的其他人。
  • “也许它可以帮助我猜的其他人”-> 就是这个想法;)我自己需要zip 的鱼等效项并找到了这个问题,因此将解决方案插入我自己的@ 987654327@ 我猜/希望其他人会发现有帮助的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2020-11-22
相关资源
最近更新 更多