Ignora caracteres especiais em comparação no shell script

1

No meu script, estou comparando a variável temp e, se estiver em branco, quero atualizar a variável temp. Mas o script abaixo não está funcionando.

Script:

temp='head -5 $filename1 | tail -1'
if [ "$temp" == " " ]
then
    temp='head -6 $filename1 | tail -1'
    echo "Blank - Updated temp value"
else
    echo "$temp not blank"
fi

Após a solução de problemas, descobri isso quando usei o comando od . Quando eu verifiquei a variável temp, ela tem caracteres especiais, porque não está considerando que ela esteja em branco.

echo $temp | od -c
0000000  \r  \n
0000002

Você pode ajudar a ignorar os caracteres especiais acima?

    
por Sandosh Kumar P 08.03.2017 / 20:04

2 respostas

1

Primeiras coisas primeiro:

if [ "$temp" == " " ]

O operador de comparação é, na verdade, = , não == . O último funciona em alguns shells, mas não é padrão. Além disso, você está comparando a variável não contra uma string vazia, mas uma contendo um único espaço, que pode ou não ser o que seu arquivo possui.

Se o arquivo puder conter espaço em branco extra, convém remover tudo com sed ou tr . E então você pode usar apenas [ -z "$temp" ] para testar se está vazio. Então:

temp=$(head -5 $filename | tail -1 | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

Em vez de head e tail , você pode usar sed para escolher uma única linha:

temp=$(sed -n '5p' | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

( 5p significa "na linha 5, (p) retira a linha", e -n inibe a ação padrão de imprimir qualquer linha.)

Na verdade, em vez do teste, estou um pouco tentado a percorrer o arquivo com um script awk para obter a quinta ou sexta linha, dependendo se o quinto tiver alguma coisa:

temp=$(tr -d ' \t\r' < $filename1 | awk '(NR==5 && $0) || NR==6 {print; exit}' )

( NR==5 testa o número da linha atual (registro), $0 expande para o conteúdo da linha e é "verdadeiro" se a linha não estiver vazia, && e || são usuais < em> e e ou operações)

    
por 08.03.2017 / 23:24
0

Usando sed e removendo todos os caracteres em branco ... temp=$(head -5 $filename1 | tail -1 | sed -r 's/\s+//g')

    
por 08.03.2017 / 20:18