Saya ingin mencetak kode ke dalam file menggunakan cat <<EOF >>
:
cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi
EOF
tetapi ketika saya memeriksa output file, saya mendapatkan ini:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Saya mencoba memasukkan tanda kutip tunggal tetapi hasilnya juga membawa tanda kutip tunggal. Bagaimana saya bisa menghindari masalah ini?
#!/bin/bash
dan tidak ada yang lain - baris#!
inilah yang membuatnya menjadi baris shebang yang valid, dan yang muncul setelahnya adalah jalur ke penerjemah.man bash
, dan cariHere Documents
. Semua detail ada.$(command)
sebagai gantinya`command`
. Untuk mendapatkan konten file, Bash memiliki$(<file)
Jawaban:
Anda hanya membutuhkan sedikit perubahan; tanda kutip tunggal pemisah dokumen di sini setelahnya
<<
.atau dengan kata lain backslash-escape:
Tanpa kutipan, dokumen di sini akan mengalami substitusi variabel, backticks akan dievaluasi, dll, seperti yang Anda temukan.
Jika Anda perlu memperluas beberapa, tetapi tidak semua, nilai, Anda harus melepaskan nilai yang ingin Anda cegah satu per satu.
akan menghasilkan
Seperti yang disarankan oleh @fedorqui , berikut adalah bagian yang relevan dari
man bash
:sumber
Atau, dengan menggunakan penanda EOF Anda, Anda perlu mengutip penanda awal sehingga perluasan tidak akan dilakukan:
IHTH
sumber
Ini seharusnya berhasil, saya baru saja mengujinya dan berfungsi seperti yang diharapkan: tidak ada ekspansi, penggantian, atau apa yang terjadi.
Menggunakan yang berikut ini juga berfungsi.
Juga, perlu dicatat bahwa saat menggunakan heredocs, seperti
<< EOF
, substitusi dan perluasan variabel dan sejenisnya terjadi. Jadi melakukan sesuatu seperti ini:akan selalu menghasilkan perluasan variabel
$HOME
dan$PWD
. Jadi jika direktori home Anda/home/foobar
dan path saat ini adalah/home/foobar/bin
,file
akan terlihat seperti ini:bukannya yang diharapkan:
sumber
<<<
hanya tersedia mulai dari Bash 3, dan tidak portabel ke shell lain.<<<
juga tersedia di ZshSaya tahu ini adalah pertanyaan berusia dua tahun, tetapi ini adalah jawaban cepat bagi mereka yang mencari 'bagaimana caranya'.
Jika Anda tidak ingin menempatkan tanda kutip di sekitar apa pun, Anda cukup menulis blok teks ke file, dan menghindari variabel yang ingin Anda ekspor sebagai teks (misalnya untuk digunakan dalam skrip) dan tidak melarikan diri dari yang Anda inginkan. ekspor sebagai nilai variabel.
Akan menulis "$ {VAR_EXAMPLE} =" string "dalam test.txt" ke dalam test.txt
Ini juga dapat digunakan untuk mengeluarkan blok teks ke konsol dengan aturan yang sama dengan menghilangkan nama file
Akan menampilkan "$ {VAR_EXAMPLE} =" string "ke konsol" ke konsol
sumber