如何将 bash 外壳字符串转换为命令



我正在运行具有不同配置的不同程序。我尝试将内部循环中的字符串(kmeansbayes)转换为我在开始时定义的变量,以便我可以运行程序并捕获控制台输出。kmeans_timebayes_time用于记录每个程序的执行时间。

#!/bin/bash
kmeans="./kmeans -m40 -n40 -t0.00001 -p 4 -i inputs/random-n1024-d128-c4.txt"
bayes="./bayes -t 4 -v32 -r1024 -n2 -p20 -s0 -i2 -e2"
kmeans_time=0
bayes_time=0
for n in {1..10}
do 
for prog in kmeans bayes
do

output=($(${prog} | tail -1))
${$prog + "_time"}=$( echo $kmeans_time + ${output[1]} | bc)
echo ${output[1]}
done
done

但是,我收到以下错误。似乎prog是作为字符串而不是我定义的命令执行的。此外,time变量的串联。我尝试了各种方法。这在 Bash 中是如何实现的?

./test.sh: line 11: kmeans: command not found
./test.sh: line 12: ${$app + "_time"}=$( echo $kmeans_time + ${output[1]} | bc): bad substitution

我要做的是按如下方式执行,它可以正常工作。

kmeans="./kmeans -m40 -n40 -t0.00001 -p 4 -i inputs/random-n1024-d128-c4.txt"
output=($($kmeans | tail -1))
# output[1] is the execution time
echo "${output[1]}"
kmeas_times=$kmeans_times+${output[1]}

我想遍历不同的程序并计算每个程序的平均执行时间

我隐约猜到你正在寻找printf -v.

bayes中的字符串不是有效的命令,也不是另一个程序的有效参数序列,所以我真的无法猜测您希望它做什么。

此外,output不是数组,因此${output[1]}没有明确定义。您是否正在尝试从该行中获取第一个令牌?您似乎放错了括号以output数组;但您可以将tail调用替换为简单的 Awk 脚本,以提取所需的令牌。

你的代码总是将kmeans_time的值添加到output;如果你想使用由$prog命名的变量,你可以使用间接扩展来指定变量的名称,但你需要一个临时变量。

嗯,也许是这样的? 希望这至少应该向您展示有效的 Bash 语法是什么样子的。

kmeans_time=0
bayes_time=0
for n in {1..10}
do 
for prog in kmeans bayes
do
case $prog in
kmeans) cmd=(./kmeans -m40 -n40 -t0.00001 -p 4 -i inputs/random-n1024-d128-c4.txt);;
bayes) cmd=(./bayes -t 4 -v32 -r1024 -n2 -p20 -s0 -i2 -e2);;
esac
output=$("${cmd[@]}" | awk 'END { print $2 }')
var=${prog}_time
printf -v "$var" %i $((!var + output))
echo "$output"
done
done

作为间接扩展的替代方法,可以使用关联数组来计算累积时间。(不过,仅限 Bash v5+。

如果交替运行这两个程序并不重要,则可以简化代码。

kmeans () {
./kmeans -m40 -n40 -t0.00001 -p 4 -i inputs/random-n1024-d128-c4.txt
}
bayes () {
./bayes -t 4 -v32 -r1024 -n2 -p20 -s0 -i2 -e2
}
get_output () {
awk 'END { print $2 }'
}
loop () {
time=0
for n in {1..10}; do
do
output=("$@" | get_output)
time=$((time+output))
print "$output"
done
printf -v "${0}_time" %i "$time"
}
loop kmeans
loop bayes

也许另请参阅 http://mywiki.wooledge.org/BashFAQ/050("我正在尝试将命令放入变量中,但复杂情况总是失败")。

最新更新