0

我正在尝试for在 shell 脚本中使用循环。

我正在从文本文件执行命令。我希望执行每个命令 10 次并将一些统计信息插入到 csv 文件中。完成该命令后,我想开始下一个,但在执行 10 次的第一个命令之后在 CSV 文件中放置一个换行符。

以下是否正确:

#Function processLine
processLine(){
line="$@"
for i in 1 2 3 4 5 6 7 8 9 10
do
START=$(date +%s.%N)
echo "$line"
eval $line > /dev/null 2>&1

END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)

echo "$line, $START, $END, $DIFF" >> file.csv 2>&1
echo "It took $DIFF seconds"
echo $line
done
}

谢谢大家的帮助

更新

它正在正确执行循环,但我无法在每个命令执行 10 次后添加换行符。

4

3 回答 3

2
processLine()
{
    line="$@"

    echo $line >> test_file
    for ((i = 1; i <= 10 ; i++))
    do
        # do not move to the next line
        echo -n "$i," >> test_file
    done

    # move to the next line: add the break
    echo >> test_file
}

echo -n > test_file

processLine 'ls'
processLine 'find . -name "*"'
于 2009-03-07T15:10:04.830 回答
0

看起来很合理。它做你想做的事吗?

你可以简化一些事情,例如

DIFF=$(echo "$END - $START" | bc)

可能只是

DIFF=$((END - START))

如果 END 和 START 是整数,并且如果您只打算使用它们一次,则无需将内容放入变量中。

如果它没有按照您的意愿执行,请编辑问题以描述问题(您看到它在做什么以及您希望它做什么)。

于 2009-03-07T15:04:39.010 回答
0

在后面加一行“ echo >> file.csvdone怎么样?还是您只想在每个 10 块之间有一个空行?然后您可以执行以下操作:

FIRST=1
processline()
{
  if (( FIRST )) then
    FIRST = 0
  else
    echo >> file.csv
  fi
  ...rest of code...
}

否则,您可能想给出所需输出的示例以及您现在获得的输出。

于 2009-03-07T18:05:54.313 回答