Tidak ada jawaban di atas yang berfungsi jika variabel Anda:
- dimulai dengan
-e
- dimulai dengan
-n
- dimulai dengan
-E
- berisi
\
diikuti dengann
- seharusnya tidak ada tambahan baris baru yang ditambahkan setelahnya
sehingga mereka tidak dapat diandalkan untuk konten string arbitrer.
Di bash, Anda dapat menggunakan "here strings" sebagai:
cat <<< "$var" > "$destdir"
Seperti disebutkan dalam komentar oleh Ash di bawah, jawaban @Trebawa (dirumuskan di ruangan yang sama dengan saya!) menggunakan printf
adalah pendekatan yang lebih baik daripada cat
.
Semua hal di atas berfungsi, tetapi juga harus mengatasi masalah (lolos dan karakter khusus) yang tidak perlu terjadi sejak awal:Karakter khusus saat variabel diperluas oleh shell. Jangan lakukan itu (ekspansi variabel) sejak awal. Gunakan variabel secara langsung, tanpa ekspansi.
Juga, jika variabel Anda berisi rahasia dan Anda ingin menyalin rahasia itu ke dalam file, Anda mungkin ingin tidak memiliki perluasan di baris perintah karena pelacakan/gema perintah dari perintah shell mungkin mengungkapkan rahasianya. Artinya, semua jawaban yang menggunakan $var
di baris perintah mungkin memiliki potensi risiko keamanan dengan memaparkan konten variabel ke pelacakan dan pencatatan shell.
Untuk variabel yang sudah diekspor, gunakan ini:
printenv var >file
Artinya, jika ada pertanyaan OP:
printenv var >"$destfile"
Catatan:nama variabel peka huruf besar/kecil.
Peringatan:Mengekspor variabel hanya untuk mencetaknya dengan printenv bukanlah ide yang baik. Jika Anda memiliki variabel skrip yang tidak diekspor yang berisi rahasia, mengekspornya akan mengeksposnya ke semua proses anak di masa mendatang (kecuali tidak diekspor, misalnya menggunakan export -n
).
Gunakan echo
perintah:
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
if
menguji $destdir
itu mewakili file.
>
menambahkan teks setelah memotong file. Jika Anda hanya ingin menambahkan teks di $var
ke file yang sudah ada isinya, lalu gunakan >>
sebagai gantinya:
echo "$var" >> "$destdir"
cp
perintah digunakan untuk menyalin file (ke file), bukan untuk menulis teks ke file.
echo
memiliki masalah jika var
berisi sesuatu seperti -e
, itu akan ditafsirkan sebagai bendera. Pilihan lainnya adalah printf
, tetapi printf "$var" > "$destdir"
akan memperluas setiap karakter yang lolos dalam variabel, jadi jika variabel berisi garis miring terbalik, konten file tidak akan cocok. Namun, karena printf
hanya menafsirkan garis miring terbalik sebagai jalan keluar dalam string format, Anda dapat menggunakan %s
penentu format untuk menyimpan konten variabel yang tepat ke file tujuan:
printf "%s" "$var" > "$destdir"