我遇到了一个相当简单的问题,一个变量的增量被打印成文件的连续字符串。
以下是代码示例:
#!/usr/bin/bash
_SesT=`date +%Y\/%m\/%d\ %H\-%M\-%S`
n="0"
Execution_IT(){
while read $3
do
((n++))
printf $n
done < ExecLog.txt
}
echo "test" && echo $_SesT
printf "Execution $(Execution_IT) Started $_SesT\r\n" >> ExecLog.txt
问题是输出的格式如下:
Execution Started 2016/02/08 19-06-44
Execution 1 Started 2016/02/08 19-06-44
Execution 12 Started 2016/02/08 19-06-44
Execution 123 Started 2016/02/08 19-06-45
Execution 1234 Started 2016/02/08 19-06-45
Execution 12345 Started 2016/02/08 19-06-45
Execution 123456 Started 2016/02/08 19-06-46...
...而不是:
Execution 1 Started 2016/02/08 19-06-44
Execution 2 Started 2016/02/08 19-06-44
Execution 3 Started 2016/02/08 19-06-45...
这是我尝试cut -d
后最常用的版本; awk
; sed
;甚至是类似C语法的for
循环。有一个与while read line
非常类似的版本,但输出完全相同。任何建议都将受到好评。
答案 0 :(得分:2)
您的printf
需要换行符:
printf "%d\n" "$n"
或者,
echo "$((++n))"
答案 1 :(得分:1)
据我了解,您只是将一行行打印到文件“ExecLog.txt”,具体而言,附加了最后一行。
该行包含的是文件中的行数和日期 这可以做得更好:
_logfile="ExecLog.txt"
n="$(wc -l <"$_logfile")" ### count the number of lines in the log file.
_SesT="$(date +%Y\/%m\/%d\ %H\-%M\-%S)" ### get time just before it is used.
echo "test $_SesT $_logfile"
printf "Execution %s Started %s\r\n" "$n" "$_SesT" | tee -a "$_logfile"
如果每行必须有一个循环来执行其他操作,请理解变量n在退出函数时不会丢失其值。因此,它可以在以后的脚本中使用。
将其打印在要添加到日志文件的行中:
#!/usr/bin/bash
_logfile="ExecLog.txt"
Execution_IT(){
n="0"
while IFS= read -r line
do
echo "loop $n"
((n++))
# do something with $line.
done < "$_logfile"
}
Execution_IT ### execute the loop.
_SesT="$(date +%Y\/%m\/%d\ %H\-%M\-%S)" ### get time just before it is used.
echo "test time=$_SesT and count=$n"
printf "Execution %s Started %s\r\n" "$n" "$_SesT" >> "$_logfile"
了解这只是一个简单的例子,对比赛条件没有任何控制。其他一些脚本可能会在日志文件中写入一行,该脚本已经计算了行,并且在添加附加行之前。在这种情况下,计数将是错误的。或者运行此脚本的多个副本可能具有相同(不正确)的计数。