bash adicionando 1 a variável em while loop [duplicate]

1

A situação é a seguinte: Eu tenho um arquivo .txt que inclui uma série de letras todas divididas por novas linhas Aqui está uma pequena parte do arquivo:

lrtjxz
lrtjhs
lrtsxv
lrtvsw
lrtywj
lrtyws
lrxwwv
lrvhsx
lryjts
lrytwv
lrzvwj
lzwscr
lzjrww
lzjroj
lzjrvs
lzjrhs
lzojvs

Eu criei um script que contaria o número de vezes que uma dessas linhas é ordenada alfabeticamente. Mas por alguma razão, o eco não é nada nem mesmo 0.

Script:

cat file.txt | while read line
do
alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
then
count=$((count + 1))
fi
done

echo "$newCount"

Alguém sabe o que estou fazendo errado?

    
por user147290 13.12.2015 / 17:26

1 resposta

1

Na verdade, existem dois problemas diferentes, e ambos contribuem para o resultado de nenhum eco.

Aqui estão os detalhes:

Má comparação

Você escreveu:

alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
  • grep -o coloca cada correspondência por conta própria por linha
  • . corresponde a um único caractere individual
  • a linha original tem caracteres horizontalmente
  • , mas o grep -o coloca os caracteres "verticalmente"
  • para que o% original $line nunca seja igual à linha pós-grep

Por exemplo, no prompt de comando, você pode testar isso:

$ line="abc"

Agora veja o que o original $line contém:

$ echo "$line"
abc

Veja agora como o grep -o o altera, e isso é basicamente seu $alphabeticSorted

$echo "$line" | grep -o .
a
b
c

Então lembre-se que você escreveu isto:

if [ "$line" == "$alphabeticSorted" ]

Então, o que o Bash realmente está testando é:

abc

igual a

a
b
c

Bem, como você pode ver, não é a mesma coisa, então sua declaração if nunca seria verdadeira mesmo que o seu $line original fosse perfeitamente alfabético.

Eu recomendo strongmente que ambos tenham a mesma orientação, horizontal ou vertical. Vamos fazer as duas horizontais, para que você possa testar no Bash

$ line2=$( echo $line | grep -o . | sort | tr -d '\n'

$ echo $line2
abc
  • adicionamos o comando tr , o -d para excluir algo e o algo, sendo novas linhas \n
  • assim, o $line2 é "horizontal", assim como o $line1

Então, no seu código original, basta modificá-lo para que

alphabeticSorted=$(echo $line | grep -o . | sort | tr -d '\n')

if [ "$line" == "$alphabeticSorted" ]

Agora deve ser uma comparação mais razoável.

Variável incorreta

Mas mesmo que você corrija isso, há um segundo problema com o script postado, que é isso no corpo do código:

count=$((count + 1))

Mas você não está se referindo a $count , você disse que escreveu:

echo "$newCount"

Porque não há $newCount definido, é claro que, ao chamar isso, não há valor, não é nada, então você não recebe nada. O que você provavelmente queria era:

echo "$count"

Então, com esses dois bugs endereçados, tanto quanto eu posso dizer pelo código fornecido, agora deve funcionar.

    
por 13.12.2015 / 21:37

Tags