Các kỹ thuật trích dẫn trong Unix/Linux

Các siêu ký tự trong Unix/Linux

Shell cung cấp các siêu ký tự đa dạng mà có ý nghĩa đặc biệt trong khi sử dụng chúng trong bất kỳ Shell script nào và gây ra sự giới hạn của một từ trừ khi được trích dẫn.

Ví dụ: siêu ký tự ? kết nối với một ký tự đơn trong khi liệt kê các file trong một thư mục và siêu ký tự * sẽ kết nối nhiều hơn một ký tự. Dưới đây liệt kê một danh sách của hầu hết các ký tự đặc biệt trong shell (cũng được gọi là siêu ký tự).

* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab

Một ký tự có thể được trích dẫn bằng cách đặt trước nó với một dấu \.

Ví dụ trong Unix/Linux:

Dưới đây là ví dụ chỉ cách để in một * hoặc một ?:

#!/bin/sh
echo Hello; Word

Nó sẽ tạo ra kết quả sau:

Hello
./test.sh: line 2: Word: command not found
shell returned 127

Bây giờ chúng ta sử dụng một ký tự được trích dẫn:

#!/bin/sh
echo Hello\; Word

Nó sẽ tạo ra kết quả:

Hello; Word

Ký hiệu $ là một siêu ký tự, vì thế nó phải được trích dẫn để tránh shell thực hiện các công việc đặc biệt liên quan đến nó:

#!/bin/sh
echo "I have \$1200"

Code trên tạo ra kết quả sau:

I have $1200

Có 4 kiểu mẫu trích dẫn được chúng tôi liệt kê trong bảng sau:

Trích dẫn    Miêu tả

Trích dẫn đơn    Tất cả các ký tự ở giữa trích dẫn này không còn ý nghĩa đặc biệt nữa với shell.

Trích dẫn kép    Hầu hết các ký tự giữa trích dẫn này không còn ý nghĩa đặc biệt, trừ các ký tự sau:

  • $
  • `
  • $
  • \'
  • \"
  • \\

Dấu gạch chéo ngược    Bất kỳ ký tự nào đằng sau dấu chéo ngược \ không còn ý nghĩa đặc biệt của nó.

Trích dẫn ngược (``)    Bất kỳ ký tự nào ở giữa trích dẫn ngược được shell đối xử như là một lệnh và được chạy.

Các trích dẫn đơn trong Unix/Linux:

Chúng ta xem xét một lệnh echo mà chứa nhiều ký tự đặc biệt trong shell sau:

echo <-$1500.**>; (update?) [y|n]

Đặt một dấu chéo ngược (\) ở trước mỗi ký tự đặc biệt là một việc gây chán ngắt và làm cho code khó để đọc.

echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]

Có một cách dễ dàng để trích dẫn một nhóm lớn các ký tự. Chúng ta đặt một trích dẫn đơn (`)tại phần đầu và cuối của chuỗi:

echo '<-$1500.**>; (update?) [y|n]'

Bất kỳ ký tự nào trong trích dẫn đơn được trích dẫn tương tự như có một dấu chéo ngược trước mỗi ký tự. Vì thế, bây giờ mỗi lệnh echo này hiển thị một cách chính xác.

Nếu một trích dẫn đơn xuất hiện trong một chuỗi để tạo kết quả đầu ra, bạn không nên đặt toàn bộ chuỗi trong trích dẫn đơn, thay vào đó bạn nên đặt trước chúng một dấu \ như sau:

echo 'It\'s Shell Programming'

Trích dẫn kép trong Unix/Linux

Bạn đang cố gắng để chạy Shell script sau. Script này sử dụng trích dẫn đơn:

VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'

Nó sẽ tạo ra kết quả sau:

$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]

Nhưng nó không phải thứ mà bạn muốn hiển thị. Như vậy rõ ràng là trích dẫn đơn ngăn cản trình thay thế biến. Nếu bạn muốn thay thế giá trị của biến và thực hiện công việc sau dấu phảy như bạn mong đợi thì khi đó bạn cần đặt các lệnh của bạn trong trích dẫn kép như sau:

VAR=ZARA
echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"

Nó sẽ tạo ra kết quả sau:

ZARA owes <-$1500.**>; [ as of (07/02) ]

Trích dẫn kép loại bỏ ý nghĩa đặc biệt của tất cả ký tự đặc biệt trừ các trường hợp sau:

  • $ cho trình thay thế tham số
  • Trích dẫn ngược cho trình thay thế lệnh
  • \$ thể hiện bằng chữ của ký hiệu Đôla
  • \` thể hiện bằng chữ của ký hiệu trích dẫn ngược
  • \" cho phép trích dẫn kép được nhúng
  • \\ cho phép ký tự dấu gạch chéo ngược được nhúng

Tất cả các dạng "\ký tự" khác được biểu hiện bằng ý nghĩa chữ của nó (không phải đặc biệt)

Bất kỳ ký tự nào trong trích dẫn đơn được trích dẫn như là một dấu chéo ngược ở phần trước mỗi ký tự. Vì thế bây giờ lệnh echo này hiển thị chính xác.

Nếu một trích dẫn đơn xuất hiện trong một chuỗi ở kết quả đầu ra, bạn không nên đặt toàn bộ chuỗi trong trích dẫn đơn mà thay vào đó bạn nên đặt trước nó một dấu chéo ngược như sau:

echo 'It\'s Shell Programming'

Trích dẫn ngược trong Unix/Linux

Đặt bất kỳ lệnh shell vào giữa các trích dẫn ngược thì shell sẽ thi hành lệnh đó.

Cú pháp

Đây là cú pháp đơn giản để đặt bất kỳ lệnh Shell nào vào giữa trích dẫn ngược:

Ví dụ:

var=`command`

Ví dụ:

Sau đây chúng tôi sẽ chạy lệnh date và giữ kết quả trong biến DATA:

DATE=`date`
echo "Current Date: $DATE"

Nó tạo ra kết quả là:

Current Date: Thu Jul  2 05:28:45 MST 2009

Bình luận