${!FOO}
melakukan substitusi ganda di bash
, artinya ia mengambil nilai (string) dari FOO dan menggunakannya sebagai nama variabel.zsh
tidak mendukung fitur ini.
Apakah ada cara untuk membuat ini berfungsi sama di bash
dan zsh
?
Latar Belakang:
Saya punya daftar variabel lingkungan, seperti
PATH MAIL EDITOR
dan ingin mencetak nama variabel terlebih dahulu dan setelah itu nilainya.
Ini berfungsi di bash
tapi bukan zsh
:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Seharusnya mungkin "cara lama" dengan eval
, tapi saya tidak bisa membuatnya bekerja:
for VAR in LIST
do
echo $VAR
echo `eval $$VAR`
done
Saya tidak akan pernah mengerti mengapa saya tidak bisa begitu saja melakukan substitusi dalam yang sewenang-wenang seperti ${${VAR}}
atau bahkan ${${${VAR}}}
jika perlu, jadi penjelasannya juga bagus.
Jawaban yang Diterima:
Baik bash dan zsh memiliki cara untuk melakukan ekspansi tidak langsung, tetapi keduanya menggunakan sintaks yang berbeda.
Cukup mudah untuk melakukan ekspansi tidak langsung menggunakan eval
; ini berfungsi di semua POSIX dan sebagian besar shell Bourne. Berhati-hatilah untuk mengutip dengan benar jika nilainya mengandung karakter yang memiliki arti khusus di shell.
eval "value="${$VAR}""
echo "$VAR"
echo "$value"
${${VAR}}
tidak berfungsi karena ini bukan fitur yang diterapkan shell mana pun. Benda di dalam kurung kurawal harus sesuai dengan aturan sintaks yang tidak menyertakan ${VAR}
. (Dalam zsh, ini adalah sintaks yang didukung, tetapi melakukan sesuatu yang berbeda:substitusi bersarang melakukan transformasi berturut-turut pada nilai yang sama; ${${VAR}}
setara dengan $VAR
karena ini melakukan transformasi identitas dua kali pada nilai.)