echo "$(( ++my_num ))" | tee "$my_file"
Tee escreve o (s) arquivo (s) nomeado (s) e a saída padrão por padrão.
Depois de typeset -i my_num=$(cat "$my_file") (que poderia ser typeset -i my_num=$(<"$my_file") em bash ), você poderia usar
my_num=$(( my_num == 0 ? 1 : my_num ))
para definir como 1 se o valor for zero. Variáveis inteiras em bash são avaliadas como zero se vazias.
Eu estava sugerindo my_num=${my_num:-1} , mas como my_num é uma variável inteira, ela será expandida para zero se estiver vazia, não para a sequência vazia, o que significa que ${variable:-value} a substituição de parâmetro não funcionaria (isso, de outra forma, se expandiria para value se a variável não estivesse definida ou vazia).
Eu provavelmente teria escrito a função como
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"
}
assumindo que "$HOME/next_int.json" sempre continha um único inteiro. Deixei de fora o touch porque o registro de data e hora de modificação dos arquivos seria atualizado por tee (mantenha touch se você precisar também do registro de data e hora de acesso).