GNU/Linux >> Belajar Linux >  >> Linux

${!foo} Dan Zsh?

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


Linux
  1. Slash Dan Backslash Di Sed?

  2. Pembagian Dasar Menggunakan Variabel Dan Integer?

  3. Cara Memperbarui IP Ubuntu dan Nama Host melalui Bash

  1. Apa Perbedaan Antara $(stuff) dan `stuff`?

  2. $_ Vs !$. Argumen Terakhir Dari Perintah Sebelumnya Dan Pengalihan Output?

  3. Gema ke stdout dan stderr

  1. Tambahkan Dan Tambahkan String Ke Setiap Elemen $* Di Shell?

  2. Script Shell Dengan Fungsi Dan Parameter Sebagai Variabel?

  3. Encode Konten File Dan Gema Sebagai Satu Baris?