Quero criar dinamicamente uma sequência de seqüências de caracteres manipulando uma matriz de elementos e criar algum procedimento aritmético.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "\n"
done
O resultado desejado seria o seguinte para $6
iguais 0
.
1q;d
2q;d
3q;d
4q;d
5q;d
Mas eu recebo esse erro
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
Eu acho que é algo simples. Costumava funcionar quando eu fazia algo como
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
FIRST=$(( $6 + 1 ))
Respostas:
Primeiro de tudo, não pode haver espaço ao redor
=
na declaração de variável embash
.Para conseguir o que deseja, você pode usar
eval
.Por exemplo, um exemplo de script como o seu:
Impressões:
Use com
eval
cautela, algumas pessoas chamam isso de mal por algum motivo válido.declare
funcionaria também:também imprime:
fonte
!
ponto de exclamaçãoprintf '%s\n' "${!name}"
?bash
parâmetrosdeclare
/eval
:printf -v varname '%fmt' args
. Algumas funções internas de conclusão do bash usam isso para chamada por referência. (passe o nome de uma variável para armazenar).declare
apenas define a variável no escopo local, enquanto aeval
abordagem a define globalmente.Se você desejar fazer referência a uma variável bash enquanto mantém o nome armazenado em outra variável, faça o seguinte:
Você armazena o nome da variável que deseja acessar, digamos, var2 nesse caso. Em seguida, você acessa com
${!<varable name>}
onde<variable name>
está uma variável que contém o nome da variável que você deseja acessar.fonte
eval var=\$$holder
maseval
é perigoso!É isso que você está tentando?
fonte
O que recebo do seu código e da sua saída desejada (corrija-me se estiver errado):
Não há uso dos nomes de variável "PRIMEIRO" / "SEGUNDO" / ..., você só precisa de um loop com um índice .. .
Isso fará o trabalho:
for i in {1..5} ; do echo $i"q;d" ; done
fonte
SUM=$(($6 + $i)); echo $SUM"q;d"
, Vejo o que estava fazendo de errado.