Saya ingin menginisialisasi beberapa string di bagian atas skrip saya dengan variabel yang belum disetel, seperti:
str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'
dan kemudian di PLACE
, EVENT
, ACTION
, dan RESULT
akan ditetapkan. Saya ingin kemudian dapat mencetak string saya dengan variabel yang diperluas. Apakah satu-satunya pilihan saya eval
? Ini sepertinya berhasil:
eval "echo ${str1}"
apakah ini standar? apakah ada cara yang lebih baik untuk melakukan ini? Akan lebih baik untuk tidak menjalankan eval
mengingat variabelnya bisa apa saja.
Jawaban yang Diterima:
Dengan jenis input yang Anda tunjukkan, satu-satunya cara untuk memanfaatkan ekspansi shell untuk mengganti nilai menjadi string adalah dengan menggunakan eval
dalam beberapa bentuk. Ini aman selama Anda mengontrol nilai str1
dan dapat memastikan bahwa itu hanya referensi variabel yang dikenal sebagai aman (tidak mengandung data rahasia) dan tidak mengandung karakter khusus shell yang tidak dikutip lainnya. Anda harus memperluas string di dalam tanda kutip ganda atau di dokumen di sini, dengan cara itu hanya "$`
bersifat khusus (harus didahului dengan di
str1
).
eval "substituted="$str1""
Akan jauh lebih kuat untuk mendefinisikan fungsi daripada string.
fill_template () {
sentence1="I went to ${PLACE} and saw ${EVENT}"
sentence2="If you do ${ACTION} you will ${RESULT}"
}
Atur variabel lalu panggil fungsi fill_template
untuk mengatur variabel keluaran.
PLACE=Sydney; EVENT=fireworks
ACTION='not learn from history'; RESULT='have to relive history'
fill_template
echo "During my holidays, $sentence1."
echo "Cicero said: "$sentence2"."