我写的shell脚本有什么问题

时间:2014-06-20 12:04:35

标签: shell unix awk ksh

这是我编写的shell脚本。

file_sequence=998
while [ $file_sequence -ne 000 ]
do
  file_sequence=`printf {"%03d\n",$((file_sequence + 1))}`;
  if [ $file_sequence -gt 999 ]
    then
    file_sequence=`printf {"%03d\n",1}`;
 fi
done

这里的问题是我得到以下输出

999
001
002
003
upto ..... 009 and then
010
009
010
009

有人可以告诉我这里发生了什么。提前致谢

4 个答案:

答案 0 :(得分:3)

0开头的整数被视为八进制。八进制中的010是十进制的8。 8 + 1是9.我认为更清晰的解决方案是使用跟踪索引的变量和担心格式化的单独变量:

#!/bin/sh

i=998
while test "$i" -ne 0
do
  test $((++i)) -gt 999 && i=1
  file_sequence=$(printf "%03d" $i)
  echo $file_sequence
done

答案 1 :(得分:1)

我认为您正在将file_sequence与要记录的其他行结合使用。 您当前的脚本将永远运行。 目前,您始终在字符串和整数之间转换file_sequence,从而导致问题。为计数创建一个日志函数:

#!/bin/ksh
function my_log
{
  (( file_sequence_nr = file_sequence_nr + 1 ))
  if [ ${file_sequence_nr} -gt 999 ]
  then
    file_sequence_nr=1
  fi
  printf "%03d %s\n" ${file_sequence_nr} "$*"

done

export file_sequence_nr=998
# Loop input file, here a test until 20
while [ $file_sequence_nr -ne 20 ]
do
  my_log "Logline random $RANDOM"
  sleep 1 # Always have a sleep 1 in a while loop until you are sure it works.
done

答案 2 :(得分:0)

我不知道问题是什么,但我确实知道。

试试这个:

file_sequence=998
while [ $file_sequence -ne 000 ]
do
  file_sequence=$(printf {"%03d\n",$(bc <<< "$file_sequence + 1")});
  if [ $file_sequence -gt 999 ]
    then
    file_sequence=$(printf {"%03d\n",1});
 fi
   echo "$file_sequence"
done

执行:

bash script.sh  | head -15
999
001
002
003
004
005
006
007
008
009
010
011
012
013
014

答案 3 :(得分:0)

将其添加到脚本顶部以强制脚本使用ksh

运行
#!/bin/ksh