sobrescreve o arquivo e ecoa para stdout

0

Eu tenho uma função bash simples para incrementar um número e armazená-lo em um arquivo:

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
}

sobre esta linha:

echo "$((++my_num))" > "$my_file" | tee

fora de curiosidade, existe uma maneira de sobrescrever o arquivo com o inteiro incrementado e ecoá-lo para stdout?

esta resposta sobre tee não parece cobrir o meu caso.

Como redirecionar a saída para um arquivo e stdout | Estouro de pilha

também, como um aparte, em relação a esta linha:

typeset -i my_num=$(cat "$my_file")

que irá capturar a representação inteira da string do arquivo. No entanto, se o arquivo estiver vazio, eu preciso usar como padrão 1.

Existe uma maneira de fazer algo como:

typeset -i my_num=$(cat "$my_file" | default "1")
    
por Alexander Mills 11.04.2018 / 20:36

1 resposta

3
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).

    
por 11.04.2018 / 20:41