dalam skrip ini saya berakhir dengan "$ 1" disimpan ke file / test.
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
kebenarannya adalah .. saya harus menyimpannya
'EOF'
sebagai 'EOF' karena argumen saya ($ 1) berisi tanda dolar.
tetapi saya perlu argumen itu untuk disimpan daripada $ 1
bash
shell-script
cat
here-document
pengguna72685
sumber
sumber
$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.cat
dan menyimpan tanda dolar", tetapi "Saya ingin memodifikasihttpd.conf
untuk mengubah <beberapa pengaturan> dengan <cara ini>".Jawaban:
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 (atauecho
s):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 dicat
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:
akan menampilkan:
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:
akan mendapatkan tubuh
myfile
sebagaimana$1
dan kemudiancat
atauecho
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
sumber
Kedengarannya seperti Anda hanya ingin menampilkan satu variabel ke file. Dalam hal ini, ini akan berhasil:
Perhatikan bahwa
/test
ada di direktori root, yang biasanya tidak memiliki izin tertulis untuk pengguna biasa.EDIT: Ingatlah bahwa Anda perlu mengutip string yang mengandung tanda dolar di baris perintah . Di situlah substitusi terjadi, dan skrip tidak dapat berbuat apa-apa setelah fakta.
sumber