GNU/Linux >> Znalost Linux >  >> Linux

Bash Dynamické (proměnné) názvy proměnných?

Chci dynamicky vytvořit sekvenci řetězců manipulací s polem prvků a vytvořením nějaké aritmetické procedury.

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "n"
done

Výsledek přání by byl níže uvedený za $6 rovná se .

1q;d
2q;d
3q;d
4q;d
5q;d

Ale dostávám tuto chybu

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

Myslím, že je to něco jednoduchého. Kdysi to fungovalo, když jsem udělal něco jako

FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"

Přijatá odpověď:

Za prvé, kolem = nesmí být žádná mezera v deklaraci proměnné v bash .

Chcete-li získat to, co chcete, můžete použít eval .

Například ukázkový skript, jako je ten váš:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    eval "$name"="'$(( $i + 1 ))q;d'"
    printf '%sn' "${!name}"
    i=$(( $i + 1 ))
done

Tiskne:

1q;d
2q;d
3q;d
4q;d
5q;d

Použijte eval opatrně, někteří lidé to z nějakého oprávněného důvodu nazývají zlem.

declare taky by to fungovalo :

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    declare "$name"="$(( $i + 1 ))q;d"
    printf '%sn' "${!name}"
    i=$(( $i + 1 ))
done

také tiskne :

1q;d
2q;d
3q;d
4q;d
5q;d

Linux
  1. Bash skriptování (I)

  2. Proč je nastavení proměnné před příkazem v Bash legální?

  3. Jak otestuji, zda je proměnná číslo v Bash?

  1. Linux bash:Přiřazení více proměnných

  2. Zkontrolujte, zda existuje proměnná v seznamu v Bash

  3. Přesměrování výstupu příkazu do proměnné v bash se nezdaří

  1. předání grepu do proměnné v bash

  2. Výstupní kód přiřazení proměnné k substituci příkazu v Bash

  3. Jak odstranit proměnnou pouze pro čtení v bash?