Atribuição a variáveis

3

Eu estava tentando encontrar uma solução para uma pergunta diferente no site e me deparei com essa questão curiosa. Aqui está o conjunto de comandos que eu emiti:

$ foo=82a9948422
$ echo $foo
82a9948422
$ echo $foo | sed 's/./&\
/g' | sort | uniq -c | sort -n -r | head -1 | awk '{print $1}'
3
$ count='echo $foo | sed 's/./&\
/g' | sort | uniq -c | sort -n -r | head -1 | awk '{print $1}''
$ echo $count
1
$

Observe como o número de caracteres únicos na variável é 3, mas quando eu a atribuo a uma variável, ela informa a contagem como 1. Estou confuso. Alguém pode explicar a discrepância, por favor?

    
por unxnut 22.02.2014 / 18:42

1 resposta

4

Não use backticks para substituições de comandos: as regras de expansão são complicadas e não são completamente consistentes entre os shells. Use $(…) em vez disso; tem exatamente o mesmo significado, mas uma sintaxe intuitiva e portátil. Você não precisa usar nenhuma citação especial; o parêntese próximo correspondente determina o final do comando e é isso. No caso raro em que o comando começa com um parêntese de abertura, coloque um espaço para evitar confusão com a expansão aritmética (por exemplo, variable=$( (foo; bar) || qux ) ).

count=$(echo $foo | sed 's/./&\
/g' | sort | uniq -c | sort -n -r | head -1 | awk '{print $1}')

ou

count=$(echo $foo | sed 's/./&\n/g' | sort | uniq -c | sort -n -r | awk 'NR==1 {print $1}')
    
por 23.02.2014 / 00:31