Menindaklanjuti Anda pertanyaan sebelumnya , sepertinya Anda ingin baik beberapa teks uninterpreted dan beberapa teks ditafsirkan masuk ke sebuah file. Dalam hal ini, menggunakan dua yang berbeda cats (atau echos):
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
Ada beberapa hal yang terjadi di sini: pertama, sintaks heredoc dengan <<. Jika Anda menyertakan tanda kutip dalam string terminator, seperti pada yang pertama di atas, seluruh heredoc tidak diinterpretasikan - tidak ada parameter dan tidak ada substitusi. Jika Anda tidak menggunakan tanda kutip, seperti pada yang kedua di cat atas, variabel seperti $1akan digantikan oleh nilai-nilai mereka dan pergantian perintah akan dimasukkan dalam teks. Anda memilih antara apakah akan mengutip string "EOF" atau tidak berdasarkan pada apakah Anda ingin penggantian atau tidak.
Untuk memasukkan kedua cats ke file yang sama, kami menggunakan >> pengalihan untuk pengalihan kedua (dan yang lebih baru): itu berarti menambahkan ke file. Untuk yang pertama, kami menggunakan satu >untuk menghapus file dan mulai segar.
Perhatikan bahwa, bahkan ketika variabel disubstitusi , setiap dolar tambahan masuk dalam nilai variabel itu tidak diganti sendiri:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
akan menampilkan:
$bar
tanpa mengganti $barnilai.
Namun, jika Anda memberikan "$" dalam argumen untuk keseluruhan skrip ini, Anda perlu menghindarinya di baris perintah atau melampirkan semuanya dalam tanda kutip tunggal. Sebagai alternatif, perintah substitusi seperti dalam pertanyaan Anda yang lain memungkinkan Anda meletakkan konten seluruh file secara langsung, termasuk tanda dolar dalam isi file. Pastikan Anda mengutip string pengganti di sana:
oo.sh "$(cat myfile)"
akan mendapatkan tubuh myfilesebagaimana $1dan kemudian catatau echosesuai kebutuhan. Batasan yang sama seperti pada jawaban saya di sana berlaku: ada batas untuk berapa lama argumen baris perintah bisa, dan jika file Anda mungkin lebih lama dari itu Anda harus menemukan pendekatan lain. Anda dapat mengetahui batas apa yang ada di sistem Andagetconf ARG_MAX
$1) berisi tanda-tanda dolar.' Tidak jika mengacu pada parameter baris perintah pertama. Pergantian dilakukan sebelum script Anda dieksekusi. Anda harus menghindarinya di baris perintah.