Estou tentando obter a palavra em cada loop. Não consigo descobrir como inserir i
em print $2
.
while [ $i -lt 4 ]
do
A=$(awk -F_ '{print $2}' <<< 'one_two_test_three')
echo $A
done
Isso produzirá, obviamente:
two
two
two
two
O que eu quero:
one
two
test
three
Eu tentei:
A=$(awk -F_ '{print $($i)}' <<< 'one_two_test_three')
não funcionou.
A maneira correta é passar a
bash/shell
variável paraawk
o script como um argumento por meio da opção-v
(variable
):A saída:
Não há necessidade de um loop de shell para analisar os dados:
O script analisa a entrada como uma
_
lista delimitada e imprime cada campo.Mais curta:
Isso define o separador de campo de saída para uma nova linha e, em seguida, força uma reformulação de todo o registro (com o novo separador inserido) antes de imprimir o registro.
Mais curta:
Acessando os dados em um loop:
Dessa forma, você não chama o utilitário que usa para analisar os dados mais de uma vez.
Supondo que os valores não tenham novas linhas, então: Seu código com alterações mínimas para que funcione: O shebang deve ser
#!/bin/bash
(ksh ou zsh) já que você está usando<<<
.No entanto, como a string vem do shell, isso pode ser simplificado para:
E usando uma matriz de valores (número variável de valores):
Se for necessário que um shell mais simples seja usado:
Claro, se não houver necessidade de definir uma variável nem for um problema definir o valor do IFS em um script:
Observe que a variável está sendo usada sem aspas, o que pode ser inseguro.