variável muda inesperadamente quando awk ou sed está no script

0

No script a seguir, o valor da variável LINES muda inesperadamente para o valor 24. Mas quando eu comento os comandos awk e sed , o resto funciona bem.

LINES=4
SNAPNUM=0

while [ $LINES -gt 0 ]
do
OUTPUT=$(ls -1 snapshot_com.crd.* | tail -$LINES | head -1)
awk '{if ($1 ~ /^trajin/) print $0, "'$OUTPUT'"; else print $0}' temp.trajin
sed '/^trajin/ s/$/ '$OUTPUT'/' temp.trajin > combine.trajin
((SNAPNUM++))
  printf "snapshot number $SNAPNUM\n"
  printf "line number $LINES\n"
 ((LINES--))
done
    
por user634433 24.12.2016 / 11:05

1 resposta

1

O comportamento que você está vendo não está diretamente relacionado a sed ou awk - é um resultado de sua escolha de LINES como o nome da sua variável de loop (e as regras de escopo para variáveis shell). p>

As variáveis de shell LINES e COLUMNS são usadas pelos emuladores de terminal para controlar o tamanho de sua janela de saída, para que eles possam agrupar corretamente o texto e paginar (quando um pager como less está sendo usava). O comportamento padrão de bash é verificar o tamanho da janela após cada comando externo:

       checkwinsize
               If set, bash checks the window size after  each  command
               and,  if necessary, updates the values of LINES and COL‐
               UMNS.

No seu caso, LINES está sendo atualizado (e redefinido para a altura do terminal padrão, que é de 24 linhas) após cada chamada de sed e awk .

Embora seja possível desativar a opção checkwinsize (usando shopt -u checkwinsize ), isso não é recomendado: basta alterar o nome da variável para algo que não está em conflito, como lines em minúscula. Uma boa regra é evitar completamente todos os nomes maiúsculos: veja, por exemplo, Existem convenções de nomenclatura para variáveis em scripts de shell?

    
por steeldriver 24.12.2016 / 15:15