Misalkan saya telah mendeklarasikan variabel berikut:
$ var='$test'
$ test="my string"
Jika saya mencetak isinya, saya melihat yang berikut:
$ echo $var
$test
$ echo $test
my string
Saya ingin mencari cara untuk mencetak konten dari konten $var
(yang merupakan konten $test
). Jadi saya mencoba melakukan hal berikut:
$ echo $(echo $var)
$test
Tapi di sini hasilnya $test
dan tidak "my string"
... Apakah mungkin untuk mencetak konten dari konten variabel menggunakan bash?
bash
shell-script
variable
echo
variable-substitution
Rafael Muynarsk
sumber
sumber
ash
, ataubash
,csh
ataudash
, ..., atauzsh
, atau POSIXsh
, atau apakah Anda perlu bekerja di berbagai sistem?Jawaban:
Anda dapat melakukannya dengan menggunakan ekspansi variabel tidak langsung bash (selama Anda boleh
$
mengabaikan variabel referensi Anda):3.5.3 Ekspansi Parameter Shell
sumber
Untuk kasus ketika nama variabel yang terkandung
var
diawali dengan$
Anda dapat menggunakaneval
:Apa yang terjadi di sini:
$var
ke nilai$test
, menghasilkaneval echo $test
perintah;eval
mengevaluasiecho $test
ekspresi dan menghasilkan hasil yang diinginkan.Perhatikan, bahwa menggunakan
eval
secara umum mungkin berbahaya (tergantung pada apa yang disimpanvar
), jadi lebih baik menghindarinya. Fitur ekspansi tidak langsung lebih baik untuk kasus Anda (tetapi Anda harus menyingkirkan proses$
masuk$test
).sumber
eval
, Anda memerlukan dua lapis tanda kutip ganda, garis ini:eval echo "\"$var\""
. Pikiran Anda, ini tidak melakukan apa-apa tentang bahaya lain menggunakaneval
yang Anda sebutkan.Mirip dengan jawaban Jesse_b , tetapi menggunakan variabel referensi nama alih-alih variabel tidak langsung (memerlukan
bash
4.3+):Variabel referensi nama
var
menyimpan nama variabel yang dirujuknya. Ketika variabel dereferenced sebagai$var
, nilai variabel lain dikembalikan.bash
selesaikan referensi nama secara rekursif:Untuk kelengkapan, menggunakan array asosiatif (dalam
bash
4.0+) juga merupakan salah satu cara untuk menyelesaikannya, tergantung pada persyaratan:Ini memberikan cara yang lebih fleksibel untuk mengakses lebih dari satu nilai dengan kunci atau nama yang dapat ditentukan secara dinamis. Ini mungkin lebih baik jika Anda ingin mengumpulkan semua nilai dari kategori tertentu dalam satu array, tetapi masih dapat mengaksesnya dengan beberapa kunci (misalnya nama yang dapat diakses dengan ID, atau nama jalur yang dapat diakses dengan tujuan dll) karena tidak mencemari namespace variabel dari skrip.
sumber
Dengan
zsh
:Dengan kulit seperti Bourne
Ingat bahwa dalam ekspansi variabel shells harus dikutip untuk mencegah split + glob (
zsh
menjadi pengecualian) danecho
tidak dapat digunakan untuk data sewenang-wenang.Karena dengan kedua
(e)
daneval
ada evaluasi kode shell, penting konten$var
tinggal di dalam kendali Anda sebagai sebaliknya yang dapat menjadi kerentanan injeksi perintah sewenang-wenang (sama dengan${!var}
pendekatan).sumber