为shell脚本创建计数器

时间:2012-09-07 11:38:05

标签: linux bash shell

每次调用脚本时,我都需要创建一个在shell(bash)脚本中使用的计数器 包含的数字必须增加一个,数字应保持为六位数,所以初始值为000000,然后是000001,然后是000002等等..... 我正在做的是,我创建了一个名为'counter'的文件,它在第一行包含一个6位整数。 所以从脚本我有这个代码:

index= cat /path/counter | tail -1   #get the counter
tmp=`expr $index + 1`                #clone and increase the counter
echo "" >/path/counter               #empty the counter
echo ${tmp} >/path/counter           #insert clone

问题是它不能在第二步工作,可能是实际失败的第一步,你有建议吗?

选项如下:

#!/bin/bash

read index < /path/counter
declare -i tmp=index+1
printf "%06d" $tmp > /path/counter

问题是它只将文件的内容提升到000007,之后我得到:

-bash: 000008: value too great for base (error token is "000008")

任何建议?

5 个答案:

答案 0 :(得分:3)

你没有正确阅读索引。尝试:

index=$(tail -1 /path/counter)

其他注意事项:

  • 您不需要cattail可以自行处理
  • 您可以使用tmp=$(expr ...)
  • 替换反引号
  • 您不需要echo "">重定向会截断文件

修改

要使数字宽6位,请尝试printf而不是echo

printf "%06d", $index

答案 1 :(得分:2)

bash有一种机制,您可以在其中指定数字的基础

#!/bin/bash
file=/path/to/counter
[[ ! -f "$file" ]] && echo 0 > $file              # create if not exist
index=$(< "$file")                                # read the contents
printf "%06d\n" "$((10#$index + 1))" > "$file"    # increment and write

答案 2 :(得分:1)

这也可以:

#!/bin/bash

if [ -e /tmp/counter ]
  then
    . /tmp/counter
  fi

if [ -z "${COUNTER}" ]
  then
    COUNTER=1
  else
    COUNTER=$((COUNTER+1))
  fi

echo "COUNTER=${COUNTER}" > /tmp/counter

echo ${COUNTER}

答案 3 :(得分:1)

[更新:修复为在文本文件中包含一个明确的基本标记,但格伦杰克曼打败了我。]

您可以稍微简化一下:

read index < /path/counter   # Read the first line using bash's builtin read
declare -i tmp=index+1       # Set the integer attribute on tmp to simplify the math
printf "10#%06d" $tmp > /path/counter    # No need to explicitly empty the counter; > overwrites

或者,您甚至不需要临时变量来保存递增的值:

read index < /path/counter
printf "10#%06d" $(( index+1 )) > /path/counter

答案 4 :(得分:0)

解决了

index=$(cat /path/counter| tail -1)
tmp=$(expr $index + 1)
printf "%06d" $tmp > /path/counter