我有一个简单的 bash 函数来增加数字并将其存储在文件中:
get_next_int (){
my_file="$HOME/next_int.json"
touch "$my_file"
typeset -i my_num=$(cat "$my_file")
echo "$((++my_num))" > "$my_file" | tee
}
关于这一行:
echo "$((++my_num))" > "$my_file" | tee
出于好奇,有没有办法用递增的整数覆盖文件并将其回显到标准输出?
这个关于 T 恤的答案似乎并不涵盖我的情况。
另外,顺便说一句,关于这一行:
typeset -i my_num=$(cat "$my_file")
将从文件中获取字符串的整数表示形式。但是,如果文件为空,我需要默认为 1。
有没有办法做类似的事情:
typeset -i my_num=$(cat "$my_file" | default "1")
答案1
echo "$(( ++my_num ))" | tee "$my_file"
默认情况下,Tee 将命名文件写入标准输出。
之后typeset -i my_num=$(cat "$my_file")
(可能typeset -i my_num=$(<"$my_file")
在bash
),你可以使用
my_num=$(( my_num == 0 ? 1 : my_num ))
如果它的值为零,则将其设置为 1。如果为空,则整数变量的bash
计算结果为零。
我曾是会建议my_num=${my_num:-1}
,但由于my_num
是一个整数变量,如果它为空,它将扩展到零,而不是空字符串,这意味着参数${variable:-value}
替换将不起作用(否则,value
如果变量未设置或为空,则会扩展为空)。
我可能会把这个函数写成
get_next_int () {
local -i val
read val <"$HOME/next_int.json"
val=$(( val == 0 ? 1 : val ))
printf "%d\n" "$(( val + 1 ))" | tee "$HOME/next_int.json"
}
假设"$HOME/next_int.json"
始终包含单个整数。我省略了,touch
因为文件修改时间戳将被更新tee
(touch
如果您还需要更新访问时间戳,请保留)。