Co jest nie tak z tym skryptem? Próbuję zdefiniować A1 = 1, B1 = 1, C1 = 1
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
a wynikiem jest:
./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found
shell-script
variable
Ake Blomberg
źródło
źródło
eval "$x"1=1
. Chociaż, jak zauważył Jakuje, tablice prawdopodobnie lepiej pasują do tego przypadku.Odpowiedzi:
Przypisanie zmiennej ma postać nazwy zmiennej, po której następuje znak równości, po której następuje (opcjonalnie) wartość.
To jest prawidłowe zadanie:
"$x"1=1
nie jest poprawnym przypisaniem, ponieważ"$x"1
nie jest nazwą zmiennej. To może być eval uated do nazwy zmiennej, ale tak nie jest. W rzeczywistości powłoka uważa, że jest to polecenie.Jednym ze sposobów robienia tego, co chcesz osiągnąć, jest:
Innym sposobem na bash (ale nie w innych powłokach) jest:
Lub też (ponownie tylko bash):
(W twoim przypadku nie ma dużej różnicy).
Ale, jak zauważył Jakuje w komentarzach , prawdopodobnie będziesz chciał korzystać z tablic, jeśli twoja powłoka je ma (ksh, bash lub zsh).
Dla pełności:
eval
wykonuje dowolne polecenia. Tak więc, jeśli po prawej stronie znaku równości masz zmienną, która rozwija się do jakiegoś polecenia, to polecenie zostanie wykonane. Poniższy kod:jest równoważne z
a=hello
.declare
to wbudowane bash do przypisywania zmiennych i nie wykonuje żadnych poleceń. Poniższy kod:jest równoważne z
a='$(echo hello)'
.let
jest podobny do tegodeclare
, że nie wykonuje poleceń. Ale w przeciwieństwie dodeclare
,let
może być stosowany do operacji arytmetycznych:jest równoważne z
a=3
.źródło
ABC = 123
jest nieprawidłowy. Ponieważ spacja jest dodawana przedequal(=)
znakiem i po nim .FAQ bash zawiera wpis dotyczący pośrednictwa. W większości przypadków użycia należy właściwie zastosować tablicę asocjacyjną lub indeksowaną. Możesz także użyć
Zapoznaj się z wpisem FAQ, aby uzyskać więcej opcji, a jednocześnie unikaj niepotrzebnych
eval
cytatów.źródło
Możesz użyć kodu w następujący sposób. W twoim kodzie powłoka jest wykonywana
"$x"1=1
jako polecenie, ponieważ nie jest to prawidłowe przypisanie zmiennej.źródło
command not found <varname>=1
gdy próbuję to zrobić (oczywiście z <nazwa> jest wartością, w której zapisałema
)echo
tutaj! Właśniea="$x"1
. Równieżlet
jest arytmetyka kontekst, dzięki czemu można przypisać tylko numery z nim.declare $a=foobar
Pracuje.