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 cat
s (atau echo
s):
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 $1
akan 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 cat
s 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 $bar
nilai.
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 myfile
sebagaimana $1
dan kemudian cat
atau echo
sesuai 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.