【发布时间】: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 留空。