Văn bản giữa các backticks được thực thi và thay thế bằng đầu ra của lệnh (trừ các ký tự dòng mới theo dõi và hãy cẩn thận rằng các hành vi shell thay đổi khi có các ký tự NUL trong đầu ra). Điều đó được gọi là thay thế lệnh bởi vì nó được thay thế bằng đầu ra của lệnh. Vì vậy, nếu bạn muốn in 5, bạn không thể sử dụng backticks, bạn có thể sử dụng dấu ngoặc kép, thích echo "$b"
hoặc chỉ bỏ bất kỳ trích dẫn nào và sử dụng echo $b
.
Như bạn có thể thấy, vì $b
chứa 5, khi sử dụng backticks bash
đang cố chạy lệnh 5
và vì không có lệnh đó, nó không thành công với thông báo lỗi.
Để hiểu cách backticks hoạt động, hãy thử chạy này:
$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
cat /etc/passwd |head -n1
nên in dòng đầu tiên của /etc/passwd
tập tin. Nhưng vì chúng tôi sử dụng backticks, nó không in cái này trên console. Thay vào đó, nó được lưu trữ trong A
biến. Bạn có thể lặp lại $A
điều này. Lưu ý rằng cách in dòng đầu tiên hiệu quả hơn là sử dụng lệnh head -n1 /etc/passwd
nhưng tôi muốn chỉ ra rằng biểu thức bên trong backticks không phải đơn giản.
Vì vậy, nếu dòng đầu tiên của / etc / passwd là root:x:0:0:root:/root:/bin/bash
, lệnh đầu tiên sẽ được thay thế động bằng bash to A="root:x:0:0:root:/root:/bin/bash"
.
Lưu ý rằng cú pháp này là của vỏ Bourne. Trích dẫn và thoát ra nhanh chóng trở thành một cơn ác mộng với nó đặc biệt là khi bạn bắt đầu lồng chúng. Ksh đã giới thiệu giải $(...)
pháp thay thế hiện đã được chuẩn hóa ( POSIX ) và được hỗ trợ bởi tất cả các trình bao (ngay cả trình bao Bourne từ Unix v9). Vì vậy, $(...)
ngày nay bạn nên sử dụng thay vì trừ khi bạn cần di chuyển đến các vỏ Bourne rất cũ.
Cũng lưu ý rằng đầu ra của `...`
và $(...)
phải chịu sự phân tách từ và tạo tên tệp giống như mở rộng biến (chỉ trong zsh, chỉ tách từ), do đó, thường sẽ cần được trích dẫn trong ngữ cảnh danh sách.