Criando n variáveis no Bash sem atribuí-las uma a uma?

0

Como faço para criar n variáveis em scripts de shell sem atribuí-las explicitamente? O que quero dizer é algo como um loop que cria var1 , var2 , var3 , ..., varx , onde x é uma variável que defini anteriormente, algo como:

read x

for ((a=0;a<x;++a)); do
 variable$a=${RANDOM}
done

(Vamos ignorar a possibilidade de que x possa ser uma string por enquanto. Mas obviamente isso não funciona. Como alguém faria isso?

O que eu realmente quero fazer é que cada argumento que eu escrevi na linha de comando quando eu executei o script para se tornar sua própria variável ARG1 , ARG2 ... ARGn com ${1} , ${2} , ..., ${n} como seu valor, portanto, haverá apenas muitas dessas variáveis, conforme os argumentos foram definidos.

    
por iamAguest 22.08.2018 / 11:03

4 respostas

2

Parece que você deseja usar uma matriz:

read x

for (( a=0; a<x; ++a)); do
   variable[a]=$RANDOM
done

printf 'First value is %s\n' "${variable[0]}"

printf 'All values (one by one): %s\n' "${variable[@]}"
printf 'All values (as one string): %s\n' "${variable[*]}"

Para a segunda parte da sua pergunta:

arg=( "$@" )

printf 'First command line argument: %s\n' "${arg[0]}"

Note também que você pode percorrer facilmente todos os argumentos de linha de comando (ou o que quer que esteja em $@ ) sem armazená-los em qualquer lugar especial:

for arg do
    printf 'Got command line argument: %s\n' "$arg"
done
    
por 22.08.2018 / 11:10
1

Tente isso,

read x

for ((a=0;a<x;++a)); do
 declare -i variable$a=${RANDOM}
done
O comando declarar permite atribuir um valor a uma variável na mesma declaração que define suas propriedades .

    
por 22.08.2018 / 11:23
0

Você precisa eval da atribuição (mas usar uma matriz seria melhor).

#!/bin/bash -vx

read x
for ((a=0;a<x;++a)); do
   eval variable$a=${RANDOM}
done

De man bash

eval [arg ...]
    The args are read and concatenated together into a single command. 
    This command is then read and executed by the shell, and its exit 
    status is returned as the value of eval.
    
por 22.08.2018 / 11:14
0

Que tal (recente shell necessário)

 for ((a=0;a<x;++a))
   do  read variable$a <<<${RANDOM}
   done
    
por 22.08.2018 / 11:53