Crie variáveis ​​e atribua valores via loop (bash)

12

Existe uma maneira de criar variáveis ​​bash e atribuir valores a elas por meio de um loop?

Algo ao longo das linhas de:

#!/bin/bash

c=0
for file in $( ls ); do
    var"$c"="$file";
    let c=$c+1;
done

EDIT: Obrigado a @Costas e @mdpc por apontar que esta seria uma péssima alternativa a uma lista; a questão é apenas teórica.

toxefa
fonte
1
NOTA: Esteja ciente de que sua instalação irá alterar / modificar / atribuir variáveis ​​apenas no processo atual e NÃO no processo pai, se você executar isso como um comando. Você pode originar o arquivo usando o '.' comando (EX:. new_vars) para fazer isso acontecer no processo atual.
Mdpc
Ok, mas o acima não funciona, na verdade, execute; var"$c"quebra isso. A resposta do @Costas demonstra como atribuir vários valores a uma única variável da lista - estou apenas perguntando teoricamente se as variáveis ​​podem realmente ser geradas com um loop.
toxefa
Hmmm ... por que tão complicado, basta usar uma nova variável cria sem qualquer alarde.
Mdpc

Respostas:

14

Bem, você pode absolutamente usar eval da seguinte maneira:

c=0
for file in $( ls ); do
    eval "var$c=$file";
    c=$((c+1));
done

Este código criará variáveis ​​denominadas var0, var1, var2, ... com cada uma segurando o nome do arquivo. Presumo que você tenha uma boa razão para fazer isso usando uma matriz ...

Bichoy
fonte
5

Possível, você quer dizer matriz. Existem algumas maneiras de atribuir valores

Primeiro:

c=0
for file in $( ls ); do
    var[$c]="$file";
    c=$(($c+1));
done

Segundo:

c=0
for file in $( ls ); do
    var[c++]="$file";
done

Terceiro:

for file in $( ls ); do
    var[${#var}]="$file";
done

Quarto:

var=( $(ls) )

Quinto

...

  1. não há necessidade de usar ls, basta colocar *para todos os arquivos
  2. dentro []do $sinal pode ser omitido
Costas
fonte
Obrigado; minha pergunta é potencialmente mais teórica do que realmente prática. No entanto, quando eu, echo $varcom os comandos listados acima, só recebo o primeiro arquivo 'listado' por ls. Estou fazendo algo errado?
toxefa
1
Se você deseja gerar toda a matriz que precisa usar echo ${var[*]}(ou ${var[@]}), um único elemento pode ser chamado como echo ${var[1]}. Nota: $varé igual${var[0]}
Costas
1
@ py4on Outra maneira é usar um loop: #for v in "${var[@]}";do echo $v;done
Costas