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.)