我需要传递一系列的夫妻值,这些值是c ++软件的参数。所以我写了这个剧本:
while read randomNumbers; do
lambda = $randomNumbers | cut -f1 -d ' '
mi = $randomNumbers | cut -f2 -d ' '
./queueSim mm1-queue $lambda $mi
done < "randomNumbers"
其中第一个arg是文件“randomNumbers”中每行的第一个值,第二个值是第二个值(当然)。我得到了段错误和“未找到命令”。
如何从行中分配lambda和mi valus并将此变量传递给c ++软件?
答案 0 :(得分:4)
没有必要削减。让我们为您分割线:
while read lambda mi; do
./queueSim mm1-queue $lambda $mi
done < randomNumbers
请注意,它通常与IFS结合使用,以在不同的字段上拆分输入行。例如,要解析/etc/passwd
(带有冒号分隔行的文件),您将经常看到:
while IFS=: read username passwd uid gid info home shell; do ...
答案 1 :(得分:1)
我建议像这样分配值:
lambda=$(echo $randomNumbers | cut -f1 -d ' ')
mi=$(echo $randomNumbers | cut -f2 -d ' ')
按照你的方式,你实际上尝试运行一个名为$randomNumbers
当前内容的命令。
修改强> 另一件事:由于您的列由空白字符分隔,您还可以将整行读入一个数组,其元素也由空格分隔。实现这一目标的一种方法是:
columns=( $(echo "$randomNumbers" | grep -o "[^ ]*") )
./queueSim mm1-queue ${columns[@]::2}
第一行匹配所有不包含任何空格的子串,并将它们放入数组columns
。第二行与您实现中的相应行相同:将前两列作为参数插入。由于使用切片完成:您获取整个数组${columns[@]}
,但通过在右侧应用边界::2
来选择它的某个子序列,该边界在columns
的每个元素中返回左侧(位置0
),不在位置>=2
上。