覆盖文件并回显到标准输出

覆盖文件并回显到标准输出

我有一个简单的 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因为文件修改时间戳将被更新teetouch如果您还需要更新访问时间戳,请保留)。

相关内容