Chcę dynamicznie tworzyć sekwencję ciągów, manipulując tablicą elementów i tworząc procedurę arytmetyczną.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "\n"
done
Wynik pożądania byłby poniżej dla $6
równości 0
.
1q;d
2q;d
3q;d
4q;d
5q;d
Ale dostaję ten błąd
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
Myślę, że to coś prostego. Kiedyś coś działało
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
FIRST=$(( $6 + 1 ))
Odpowiedzi:
Przede wszystkim nie może być żadnej przestrzeni
=
w deklaracji zmiennej wbash
.Aby uzyskać to, czego chcesz, możesz użyć
eval
.Na przykład przykładowy skrypt jak twój:
Wydruki:
Używaj
eval
ostrożnie, niektórzy nazywają to złem z jakiegoś ważnego powodu.declare
też by działał:drukuje również:
źródło
!
wykrzyknikprintf '%s\n' "${!name}"
?bash
parametrów.declare
/eval
:printf -v varname '%fmt' args
. Niektóre funkcje wewnętrzne kończące bash używają tego do wywołania przez referencję. (przekaż nazwę zmiennej, w której chcesz zapisać).declare
tylko ustawia zmienną w zasięgu lokalnym, podczas gdyeval
podejście ustawia ją globalnie.Jeśli chcesz odwoływać się do zmiennej bash, zachowując nazwę w innej zmiennej, możesz to zrobić w następujący sposób:
W tym przypadku przechowujesz nazwę zmiennej, do której chcesz uzyskać dostęp, powiedzmy var2. Następnie uzyskujesz do niego dostęp,
${!<varable name>}
gdzie<variable name>
jest zmienna zawierająca nazwę zmiennej, do której chcesz uzyskać dostęp.źródło
eval var=\$$holder
aleeval
jest niebezpieczny!Czy tego właśnie próbujesz?
źródło
Co otrzymuję z twojego kodu i pożądanych danych wyjściowych (popraw mnie, jeśli się mylę):
Nie używa się nazw zmiennych „FIRST” / „SECOND” / ..., wystarczy pętla z indeksem. .
Spowoduje to wykonanie zadania:
for i in {1..5} ; do echo $i"q;d" ; done
źródło
SUM=$(($6 + $i)); echo $SUM"q;d"
, Widzę, co robiłem źle.