Sự khác nhau giữa doublequotes Điên, đơn "và backticks` `trên dòng lệnh?


43

Tôi thường thấy các hướng dẫn trên web hoặc các bài đăng trên trang web này sử dụng rất nhiều các ký tự sau trong dòng lệnh. Thường thì có vẻ như chúng được sử dụng cho các mục đích khá giống nhau. Sự khác biệt giữa chúng khi được sử dụng trên dòng lệnh hoặc để lập trình shell là gì? Vì mục đích gì tôi sử dụng cái nào trong số chúng?

" " double quotes

' ' single quotes

` ` backticks

Câu trả lời:


43

Vì lợi ích của ví dụ, hãy xem xét biến đó foochứa uname( foo=uname).

  • echo "$foo"đầu ra uname, thay thế các biến trong văn bản.
    • Đối với một $nhân vật nghĩa đen bên trong "dấu ngoặc kép, sử dụng \$; cho một nghĩa đen ", sử dụng \".
  • echo '$foo'đầu ra $foo, chuỗi chính xác.
    • Thậm chí 'không thể thoát được như trích dẫn \'bên trong '. Nhưng bạn có thể sử dụng 'foo'\''bar'.
  • echo `$foo`đầu ra Linux, thực hiện nội dung của biến và echoin nó.

\luôn được xử lý theo nghĩa đen khi được đặt trong dấu ngoặc đơn, ngay cả khi nó đứng trước a '. Sau khi mở ', tiếp theo 'luôn được hiểu là trích dẫn kết thúc. Một cái gì đó như trích dẫn 'trong một chuỗi trích dẫn có thể đạt được bằng cách kết thúc trích dẫn, thoát 'riêng lẻ và bắt đầu trích dẫn lại. Đó là, trong khi \'không hoạt động giữa các 'ký tự mở và đóng , '\''thì không. (Xem phần chỉnh sửa của Gilles đối với một trong những bài đăng của tôi khi tôi mắc lỗi tương tự để biết chi tiết.)
Eliah Kagan

11

Điều này được giải thích rất độc đáo trong phần có liên quan của hướng dẫn bash. Tóm lại, bất cứ điều gì trong dấu ngoặc đơn được giải thích theo nghĩa đen. Ví dụ:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

So sánh với các phiên bản không trích dẫn:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

Dấu ngoặc kép cho phép mở rộng biến (cũng mở rộng lịch sử và một số thứ khác). Về cơ bản, bạn sử dụng chúng khi bạn đang xử lý một cái gì đó mà bạn muốn thấy mở rộng. Ví dụ:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

Nói cách khác, dấu ngoặc đơn bảo vệ hoàn toàn một chuỗi khỏi vỏ trong khi dấu ngoặc kép bảo vệ một số thứ (ví dụ khoảng trắng) nhưng cho phép các biến và ký tự đặc biệt được mở rộng / giải thích chính xác.


1
không chắc chắn liệu OP đã được thay đổi sau khi thực tế, nhưng câu trả lời này không đề cập đến backticks?
Alexander Mills

5

Dấu ngoặc đơn ( '') được sử dụng để bảo toàn giá trị bằng chữ của mỗi ký tự được đặt trong dấu ngoặc kép.

Sử dụng dấu ngoặc kép ( ""), giá trị bằng chữ của tất cả các ký tự được bao quanh được giữ nguyên, ngoại trừ ký hiệu đô la ( $), ``dấu gạch chéo ngược ( dấu ngoặc đơn ngược ), và dấu gạch chéo ngược ( \).

Khi được đặt bên trong back-ticks ( ``), shell diễn giải một cái gì đó có nghĩa là "đầu ra của lệnh bên trong back-tick". Điều này được gọi là "thay thế lệnh", vì đầu ra của lệnh được thay thế cho chính lệnh đó.

người giới thiệu:


3
echo '$HOME' is "$HOME"

Dấu ngoặc đơn ngăn chặn sự mở rộng biến, trong khi dấu ngoặc kép cho phép nó.


2

Tôi chỉ nói chung chung nhưng:

""- Được sử dụng để xử lý một số thông tin bên trong chúng trước khi đầu ra. (Giống như trong PHP.)

  • Ví dụ: name=NESS; echo "Hello my name is $name"sẽ xuất:Hello my name is NESS

''- Được sử dụng để hiển thị đầu ra như nó là. (Cũng giống như trong PHP.)

  • Sử dụng ví dụ trên, nó sẽ xuất ra Hello my name is $name

Vì vậy, sự khác biệt giữa dấu ngoặc kép và dấu ngoặc đơn là dấu ngoặc kép xử lý biến và hiển thị giá trị, trong khi dấu ngoặc đơn hiển thị tên của biến mà không xử lý.

`` - Được sử dụng để trích dẫn các lệnh mà sau đó được gán cho một biến khác.


1

Các trích dẫn đơn kèm theo một giá trị sẽ được thực hiện theo nghĩa đen: tất cả các loại mở rộng đều bị loại bỏ. Thường được sử dụng nếu giá trị bao gồm hoặc có thể bao gồm khoảng trắng (space, tab, mới-line), hoặc các ký tự đặc biệt ( $, \, `) mà người dùng không muốn được mở rộng / điều trị đặc biệt bởi vỏ.

Dấu ngoặc kép bao gồm một giá trị sẽ có các biến và thay thế ký tự được thực hiện. Cần thiết khi đầu ra có thể chứa khoảng trắng và phải được chỉ định dưới dạng một giá trị.

Các trích dẫn trở lại kèm theo một lệnh, kết quả được muốn là giá trị. Vỏ mới hơn cho phép sử dụng $(...)thay thế `...`. Tôi thích phương pháp mới hơn.

Các mã sau đây có thể giúp hiểu những gì đang xảy ra.

CMD = 'ls.'
tiếng vang vuông: $ CMD
đặt $ CMD
tiếng vang thô 1: $ 1
tiếng vang thô: $ *
đặt "$ CMD"
tiếng vang dq: $ 1
tiếng vang bq: `$ CMD`
tiếng vang mới: $ ($ CMD)
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.