Kebingungan dengan perintah printf?

13

Saya harus mencetak tiga baris berikut dalam satu perintah cetak tanpa menggunakan perintah gema. Jadi saya telah memilih perintah printf. Berikut adalah tiga baris:

  Different characters can be represented and supported 
  in the print command, for example: 
  x-y, X+Y, –, +, <, >, %, $, #, &.

Apa yang telah saya lakukan sejauh ini adalah:

   printf "
   Different characters can be represented and supported 
   in the print command, for example: 
   x-y, X+Y, –, +, <, >, %, $, #, &.
   "

Tapi saya mendapat kesalahan bash untuk baris ketiga ','.

Jadi, siapa pun akan menerangi saya.

Narwen
sumber
By the way, ada perbedaan antara printperintah printfperintah.
Flimm

Jawaban:

12

Lebih baik digunakan:

printf "Different characters can be represented and supported\n\
in the print command, for example:\n\
x-y, X+Y, –, +, <, >, %%, $, #, &.\n"

Anda mendapatkan kesalahan itu, seperti yang orang lain katakan di sini, karena %karakter yang spesial dan harus melarikan diri.

Lihat man 1 printfuntuk info lebih lanjut.

Radu Rădeanu
sumber
@Narwen saya menyarankan Anda untuk menggunakan pria itu setiap saat ketika Anda harus bermain dengan karakter khusus. Untuk mencari di pria, ketik /your_string_to_searchdan kemudian tekan enter.
Radu Rădeanu
4
Inti dari printfadalah bahwa %karakter dan apa yang dilakukannya!
Kaz
14

%adalah karakter khusus di printf. Itulah yang menyebabkan kesalahan. Anda harus menghindarinya %%.

$juga dapat diganti ketika berada dalam tanda kutip ganda oleh kulit luar, jadi Anda harus menghindari itu ( \$). Biasanya hanya lebih mudah menggunakan tanda kutip tunggal.

Oli
sumber
5
Tanda dolar hanya khusus bila diikuti oleh nama variabel yang valid yang tidak berlaku di sini.
glenn jackman
1
$variablediganti dengan shell, bukan oleh printf. Jika Anda mengelilingi string Anda dengan tanda kutip tunggal dan bukan tanda kutip ganda, $tidak akan ada interpolasi oleh shell dan akan diteruskan langsung ke printf.
Flimm
@glennjackman Selain menjadi spesial ketika diikuti oleh nama variabel yang valid (apakah variabel itu benar-benar didefinisikan atau tidak), $juga spesial ketika diikuti oleh{ atau oleh simbol parameter khusus , atau satu digit atau lebih . Namun, ide dasar dari apa yang Anda katakan itu benar.
Eliah Kagan
9

yang %khusus untuk printf: itu adalah char terkemuka dalam format specifier. Jika Anda ingin persentase literal, gunakan%%

glenn jackman
sumber
9

Agak mengejutkan untuk melihat bahwa ketika Anda tidak diizinkan untuk menggunakan echo perintah yang Anda pilih untuk menggunakan printfperintah sebagai gantinya.

Mengapa tidak cat?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF
mereka
sumber
Tapi saya harus mengganti echo dengan perintah cetak sesuai pertanyaan. Tapi terima kasih atas bantuannya.
Narwen
2
Untuk menghindari menafsirkan string seperti $foodalam teks, gunakan cat <<'EOF'sebagai ganti cat <<EOF.
Lekensteyn
4

printfadalah cetak yang diformat yang menggunakan format string sebagai parameter pertama. Parameter lainnya digunakan dalam format string. Tiga hal yang perlu diingat saat menggunakan printfadalah:

  1. Meskipun banyak bahasa memiliki printfpernyataan / perintah / fungsi, mereka semua sedikit berbeda sehingga selalu memverifikasi detail dalam dokumentasi khusus bahasa (C, bash, php, perl, dll.),

  2. Anda tidak boleh menggunakan informasi yang diberikan pengguna dalam string format. Ini selalu merupakan kelemahan keamanan. Jika Anda ingin menampilkan string yang disediakan pengguna, gunakan string format seperti "%s".

  3. \Tanda garis miring terbalik ( ) dan tanda persen ( %) adalah karakter escape yang mengubah arti karakter berikut jika Anda ingin karakter escape muncul di output Anda, itu harus melarikan diri atau ditarik dari parameter lain. Tanda dolar ( $) tidak khusus untuk printf, tetapi khusus untuk shell, jadi berhati-hatilah dengan kutipan Anda.

printfbagus untuk memformat angka. lihat halaman manual untuk detailnya

Hildred
sumber
2

Seperti yang disebutkan orang lain, the % simbol ini khusus untukprintf .

Jika Anda hanya ingin mencetak string seperti apa adanya, berikan printf %ssebagai argumen pertama, dan string yang dikelilingi tanda kutip tunggal sebagai argumen kedua:

printf %s '
Different characters can be represented and supported 
in the printf command, for example: 
x-y, X+Y, –, +, <, >, %, $, #, &.
'

Menggunakan tanda kutip tunggal dan bukan tanda kutip ganda menghentikan shell dari menyisipkan simbol seperti $.

Flimm
sumber