Suponha que eu tenha uma variável shell Unix como abaixo
variable=abc,def,ghij
Eu quero extrair todos os valores ( abc
, def
e ghij
) usando um loop for e passar cada valor em um procedimento.
O script deve permitir a extração de um número arbitrário de valores separados por vírgula de $variable
.
Respostas:
Você pode usar o seguinte script para percorrer dinamicamente sua variável, não importa quantos campos ela tenha, desde que sejam separados por vírgulas.
Em vez da
echo "$i"
chamada acima, entredo
edone
dentro do loop for, você pode invocar seu procedimentoproc "$i"
.Atualização : O trecho acima funciona se o valor da variável não contém espaços. Se você tiver esse requisito, use uma das soluções que podem mudar
IFS
e, em seguida, analise sua variável.Espero que isto ajude.
fonte
$variable
contém espaços em branco, por exemplo,variable=a b,c,d
=> imprime 4 linhas (a | b | c | d) em vez de 3 (ab | c | d)"value
**. você poderia atualizar se há algum regex para remover isso ..Não mexer com IFS
Não chamar o comando externo
Usando a manipulação de string bash http://www.tldp.org/LDP/abs/html/string-manipulation.html
fonte
IFS
!$i
contiver espaços, eles serão divididos (e essa pode ser a razão pela qual é passado como separado por vírgulas em vez de por espaços)for i in ${variable//,/$IFS} do; echo "$i"; done
Se você definir um separador de campo diferente, poderá usar diretamente um
for
loop:Você também pode armazenar os valores em uma matriz e, em seguida, percorrê-la conforme indicado em Como faço para dividir uma string em um delimitador no Bash? :
Teste
Você pode encontrar uma abordagem mais ampla nesta solução para Como iterar por meio de uma lista separada por vírgulas e executar um comando para cada entrada .
Exemplos da segunda abordagem:
fonte
while
para ler em uma matriz e outra para percorrer os resultados.IFS
voltar ao que era antes?Eu prefiro usar tr em vez de sed, porque o sed tem problemas com caracteres especiais como \ r \ n em alguns casos.
outra solução é definir IFS para um determinado separador
fonte
Aqui está uma solução alternativa baseada em tr que não usa eco, expressa como uma linha.
Parece mais arrumado sem eco, mas essa é apenas minha preferência pessoal.
fonte
Tente este.
fonte
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. Depois disso, faça o loop for em loop while. Você pode conseguir esse.Outra solução não usando IFS e ainda preservando os espaços:
fonte
Esta é minha solução bash pura que não altera o IFS e pode incluir um delimitador regex personalizado.
fonte