Eu tenho um script Bash com uma função para registrar mensagens com hora e status, e quero manter meu script apenas com 80 colunas:
#!/bin/bash
log_message() {
echo "[$(date)]-[$1] : $2" >> log.txt
}
varName="John Doe"
# line break to not exceed 80 columns
log_message "WARNING" "I am "${varName}" and i want to limit this line \
to 80 columns"
O resultado no arquivo de log não é o esperado:
[Fri Jun 24 13:50:12 CEST 2022]-[WARNING] : I am John
Qual é a maneira correta de fazer isso no Bash?
No seu caso, o problema não é a continuação da linha, mas o fato de você ter usado aspas duplas dentro do segundo argumento entre aspas sem escapar deles ( Observe que, vendo a resposta de @Stéphane, pode ser que você realmente pretendia isso - veja abaixo por que isso não é uma boa ideia ). Experimente com
Com suas aspas sem escape antes
${varName}
, a referência da variável agora está fora das aspas duplas e sujeita a divisão de palavras , então alog_message
chamada vê os seguintes argumentos:WARNING
I am John
(aJohn
parte ainda será considerada parte do segundo token porque segue as aspas duplas de "fechamento" imediatamente)Doe and i want to limit this line to 80 columns
(Doe
é anexado ao terceiro argumento pelo mesmo motivo queJohn
faz parte do segundo)No entanto, sua função
log_message
interpreta apenas os dois primeiros argumentos, portanto, o fragmento de string restante é perdido.FYI, um melhor
log_message
embash
poderia ser escrito:O que evita executar um
date
comando e reabrir o arquivo de log a cada vez e permite passar mais de uma mensagem (cada mensagem exibida em uma linha separada).Em seguida, use
\
para continuação de linha como já mencionado por @AdminBee. Observe que no sh/bash, ao contrário da maioria das outras linguagens, é em torno de expansões de parâmetros ou caracteres que são especiais para o shell que você precisa, exceto as aspas. Com"...."${var}"..."
você acabou deixando o sem${var}
aspas o que significava que sofre split+glob!É uma opção. Cuidado com continuações de linha como essa (com
\
seguido de nova linha), funciona dentro ou fora de aspas duplas, ou em documentos aqui, mas não dentro de aspas simples nem documentos aqui com um delimitador entre aspas.Com isso
log_message
, você também pode fazer:Para entrar
log.txt
: