Bash 脚本,使用参数增加/减少 txt 文件中的数字

Bash 脚本,使用参数增加/减少 txt 文件中的数字

我对 Linux 相当陌生,目前正在研究 bash 脚本。手头的任务是在脚本和参数的帮助下,它应该使用 +1 或 -1 增加/减少文件中的值。

我认为这可以对 txt 文件完成。

例子

  • 文件中的值加1
    ./script.sh in
    
  • 将文件中的值减 1
    ./script.sh out
    

如果有人能指出正确的方法,给出示例或解决方案,将不胜感激。

答案1

您可以使用 读取值、递增、写入新值awk,并在 中进行参数处理sh

#! /bin/sh -
file=/path/to/counter
case "$#:$1" in
   (1:in) incr=1;;
  (1:out) incr=-1;;
      (*) echo >&2 'need "in" or "out" as the one and only one argument'
          exit 1
esac

awk -v incr="$incr" '
  {print $0 + incr > FILENAME; exit}
  END {if (!NR) print incr > FILENAME}' 3<> "$file" "$file"

它期望$file包含一个带有一个数字的行,并递增或递减它。如果该行不包含数字或文件为空,它将被视为 0。这比使用 shell 算术评估来执行增量要好,因为这些是如果不能保证输入具有合理的值,则不安全

如果该文件事先不存在,它将被创建(通过3<> "$file")并被视为也包含 0。

请注意,该脚本对于并发执行并不安全,因为同时运行的两个实例可以读取相同的旧值并独立地增加它。为了解决这个问题,如果您的系统有该flock命令,您可以将该awk命令替换为:

{
  flock 3 &&
    awk -v incr="$incr" '
    {print $0 + incr > FILENAME; exit}
    END {if (!NR) print incr > FILENAME}' "$file"
} 3<> "$file"

whereflock获取文件的独占锁。


1 数字可以是整数或浮点数(甚至可能在某些 awk 实现和某些环境中以十六进制表示),但请注意,非整数以 6 位精度表示,因此在增量后将成为99999.5100000。因此,如果处理浮点数和高值,您可能需要添加一个实例来提高精度。999999.51e+06-v OFMT='%.15g'

相关内容