Apa yang salah dengan skrip ini? Saya mencoba mendefinisikan A1 = 1, B1 = 1, C1 = 1
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
dan hasilnya adalah:
./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
sumber
sumber
eval "$x"1=1
. Meskipun, seperti dicatat Jakuje, array mungkin lebih cocok untuk kasus ini.Jawaban:
Tugas variabel memiliki bentuk nama variabel, diikuti oleh tanda sama dengan, diikuti oleh nilai (opsional).
Ini adalah tugas yang valid:
"$x"1=1
bukan tugas yang valid, karena"$x"1
bukan nama variabel. Mungkin eval uated untuk nama variabel, tetapi tidak. Shell, pada kenyataannya, percaya itu adalah perintah.Salah satu cara untuk melakukan apa yang ingin Anda capai adalah ini:
Cara lain di bash (tetapi tidak di shell lain) adalah:
Atau juga (khusus lagi bash):
(Tidak ada banyak perbedaan dalam kasus Anda.)
Tetapi, seperti yang dicatat Jakuje dalam komentar , Anda mungkin ingin menggunakan array, jika shell Anda memilikinya (ksh, bash atau zsh).
Untuk kelengkapan:
eval
mengeksekusi perintah sewenang-wenang. Jadi, jika di sisi kanan tanda sama dengan Anda memiliki variabel yang mengembang ke beberapa perintah, perintah itu akan dieksekusi. Kode berikut:setara dengan
a=hello
.declare
adalah bash builtin untuk menetapkan variabel dan tidak akan menjalankan perintah apa pun. Kode berikut:setara dengan
a='$(echo hello)'
.let
mirip dengandeclare
, dalam hal itu tidak menjalankan perintah. Tetapi bertentangan dengandeclare
,let
dapat digunakan untuk operasi aritmatika:setara dengan
a=3
.sumber
ABC = 123
tidak valid. Karena spasi ditambahkan sebelum dan sesudahequal(=)
tanda.FAQ bash memiliki entri tentang tipuan. Dalam kebanyakan kasus penggunaan, apa yang seharusnya Anda lakukan adalah menggunakan array asosiatif atau indeks. Anda juga bisa menggunakan
Lihat entri FAQ untuk lebih banyak opsi untuk melakukan ini sambil tetap menghindari penawaran yang berantakan
eval
.sumber
Anda dapat menggunakan kode seperti berikut. Dalam shell kode Anda dieksekusi
"$x"1=1
sebagai perintah karena itu bukan penugasan variabel yang valid.sumber
command not found <varname>=1
ketika saya mencoba melakukan itu (jelas dengan <varname> menjadi nilai yang saya simpana
)echo
sini! Adila="$x"1
. Jugalet
merupakan konteks aritmatika, jadi Anda hanya dapat menetapkan angka dengannya.declare $a=foobar
bekerja.