${!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.)