我对 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.5
和100000
。因此,如果处理浮点数和高值,您可能需要添加一个实例来提高精度。999999.5
1e+06
-v OFMT='%.15g'