Saya tahu topik ini sudah lama, tetapi saya memiliki solusi kerja yang lebih sederhana tanpa mengekspor variabel. Bisa jadi oneliner, tapi saya lebih suka membagi menggunakan \ di ujung jalur.
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
Variabel harus didefinisikan ke baris yang sama dengan envsubst adalah untuk dianggap sebagai variabel lingkungan.
'$var1,$var3' adalah opsional untuk hanya mengganti yang ditentukan. Bayangkan sebuah file masukan yang berisi ${VARIABLE_USED_BY_JENKINS} yang seharusnya tidak diganti.
Mengacu pada jawaban 2, saat mendiskusikan envsubst, Anda bertanya:
Bagaimana cara membuatnya bekerja dengan variabel yang dideklarasikan dalam skrip .sh saya?
Jawabannya adalah Anda hanya perlu mengekspor variabel Anda sebelum memanggil envsubst .
Anda juga dapat membatasi string variabel yang ingin Anda ganti di input menggunakan envsubst SHELL_FORMAT argumen (menghindari penggantian string yang tidak diinginkan dalam input dengan nilai variabel shell yang umum - mis. $HOME ).
Misalnya:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
Akan mengganti semua contoh $VAR1 dan $VAR2 (dan hanya VAR1 dan VAR2 ) di source.txt dengan 'somevalue' dan 'someothervalue' masing-masing.
Lihat, ternyata di sistem saya ada envsubst perintah yang merupakan bagian dari paket gettext-base.
Jadi, ini membuatnya mudah:
envsubst < "source.txt" > "destination.txt"
Perhatikan jika Anda ingin menggunakan file yang sama untuk keduanya, Anda harus menggunakan sesuatu seperti sponge moreutil , seperti yang disarankan oleh Johnny Utahh:envsubst < "source.txt" | sponge "source.txt" . (Karena pengalihan shell akan mengosongkan file sebelum dibaca.)