Nhầm lẫn với lệnh printf?


13

Tôi phải in ba dòng sau trong một lệnh in mà không sử dụng lệnh echo. Vì vậy, tôi đã chọn lệnh printf. Đây là ba dòng:

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

Những gì tôi đã làm cho đến nay là:

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

Nhưng tôi đã gặp lỗi bash cho dòng thứ ba ','.

Vì vậy, bất cứ ai sẽ soi sáng cho tôi lên.


Nhân tiện, có một sự khác biệt giữa printlệnh printflệnh.
Flimm

Câu trả lời:


12

Sử dụng tốt hơn:

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

Bạn nhận được lỗi đó, như những người khác đã nói ở đây, vì %tính cách đặc biệt và phải được thoát.

Xem man 1 printfđể biết thêm.


@Narwen Tôi yêu cầu bạn sử dụng người đàn ông mọi lúc khi bạn phải chơi với các nhân vật đặc biệt. Để tìm kiếm trong man, gõ /your_string_to_searchvà sau đó nhấn enter.
Radu Rădeanu

4
Toàn bộ quan điểm printf%nhân vật đó và những gì nó làm!
Kaz

14

%là một nhân vật đặc biệt trong printf. Đó là những gì gây ra lỗi. Bạn cần phải thoát nó như %%.

$cũng có thể được thay thế khi trong dấu ngoặc kép của lớp vỏ bên ngoài, vì vậy bạn nên thoát cái đó ( \$). Nó thường chỉ dễ dàng hơn để sử dụng dấu ngoặc đơn.


5
Ký hiệu đô la chỉ đặc biệt khi được theo sau bởi một tên biến hợp lệ không phải là trường hợp ở đây.
glenn jackman

1
$variableđược thay thế bởi vỏ, không phải bởi printf. Nếu bạn bao quanh chuỗi của mình bằng dấu ngoặc đơn thay vì dấu ngoặc kép, $sẽ không bị nội suy bởi trình bao và sẽ được chuyển trực tiếp đến printf.
Flimm

@glennjackman Bên cạnh việc đặc biệt khi được theo sau bởi một tên biến hợp lệ (dù đó có thực sự được xác định hay không), $cũng đặc biệt khi được theo sau bởi{ hoặc bởi một ký hiệu tham số đặc biệt hoặc một hoặc nhiều chữ số . Ý tưởng cơ bản về những gì bạn đang nói là chính xác, mặc dù.
Eliah Kagan

9

Điều %đặc biệt đối với printf: nó là char hàng đầu trong định dạng định dạng. Nếu bạn muốn một phần trăm theo nghĩa đen, hãy sử dụng%%


9

Có một chút ngạc nhiên khi thấy rằng khi bạn không được phép sử dụng echolệnh mà bạn đã chọn để sử dụng printflệnh thay thế.

Tại sao không cat?

#!/bin/bash

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

Nhưng tôi đã phải thay thế echo bằng lệnh in theo câu hỏi. Nhưng cảm ơn vì sự giúp đỡ.
Narwen

2
Để tránh diễn giải các chuỗi như $footrong văn bản, sử dụng cat <<'EOF'thay vì cat <<EOF.
Lekensteyn

4

printflà một bản in được định dạng trong đó lấy một chuỗi định dạng làm tham số đầu tiên của nó. Phần còn lại của các tham số được sử dụng trong chuỗi định dạng. Ba điều cần nhớ khi sử dụng printflà:

  1. Mặc dù nhiều ngôn ngữ có printfcâu lệnh / lệnh / hàm, tất cả chúng đều khác nhau một chút vì vậy luôn xác minh chi tiết trong tài liệu cụ thể về ngôn ngữ (C, bash, php, perl, v.v.),

  2. Bạn không bao giờ nên sử dụng thông tin người dùng cung cấp trong chuỗi định dạng. Đây luôn là một lỗ hổng bảo mật. Nếu bạn muốn hiển thị chuỗi do người dùng cung cấp, hãy sử dụng chuỗi định dạng như "%s".

  3. Cả dấu gạch chéo ngược ( \) và dấu phần trăm ( %) là các ký tự thoát thay đổi ý nghĩa của (các) ký tự sau nếu bạn muốn một ký tự thoát xuất hiện trong đầu ra của mình, nó phải được thoát hoặc kéo vào từ một tham số khác. Ký hiệu đô la ( $) không đặc biệt đối với printf, nhưng đặc biệt đối với vỏ, vì vậy hãy cẩn thận với các trích dẫn của bạn.

printflà tuyệt vời để định dạng số. nhìn vào trang người đàn ông để biết chi tiết


2

Như những người khác đã đề cập, %biểu tượng là đặc biệt cho printf.

Nếu bạn chỉ muốn in ra một chuỗi như hiện tại, hãy đưa ra printf %snhư một đối số đầu tiên và chuỗi được bao quanh trong các dấu ngoặc đơn làm đối số thứ hai:

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

Sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép sẽ ngăn vỏ khỏi các ký hiệu nội suy như $.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.