Sự khác biệt giữa $ '$ foo' và $ Biệt $ foo


9

Tôi đang gặp khó khăn khi tìm ra một số sắc thái giữa dấu ngoặc đơn và dấu ngoặc kép trong ngữ cảnh thay đổi

Tôi xác định:

foo=pwd

sau đó chạy chúng:

echo $'$foo'

Mà echos $foo(có nghĩa là đầu tiên $trong lệnh echo của tôi bị loại bỏ)

echo $"$foo"

Echos này pwd(có nghĩa là bash mở rộng $foo, biến của tôi, đến giá trị của nó)

echo $`$foo`

Cuối cùng là tiếng vang này $~/scripts(tôi dự kiến ​​nó sẽ in ~/scriptsvà không $~/scripts)

ai đó có thể giúp tôi tìm ra những khác biệt?

Câu trả lời:


11

Cuối cùng, bản cuối cùng được in $~/scripts$`foo`là sự kết hợp của một chữ $theo sau là sự thay thế lệnh; do đó, hàng đầu $được hiểu là một nghĩa đen $và theo sau `$foo`là một thay thế lệnh.


Tôi đã xóa các thẻ mã và thay thế chỉ bằng các ký tự `` `` `` ``. Vui lòng quay lại nếu bạn thích các thẻ mã
Tim

@Tim Cảm ơn, không chắc chắn những gì tôi đã làm chính xác nhưng vì một số lý do sau khi bài chỉnh sửa của bạn xuất hiện cũng bị phá vỡ như trong lần sửa đổi đầu tiên của tôi, vì vậy tôi đã quay lại ... Và bây giờ tôi thấy nó có vẻ ổn trong bản sửa đổi. Không chắc chắn điều gì đã xảy ra, sẽ kiểm tra điều này trong hộp cát định dạng trước khi quay lại phiên bản của bạn vì tôi sợ tôi có thể làm gián đoạn bài đăng một lần nữa. Bất kể, cảm ơn cho những nỗ lực.
kos

chắc chắn, không có vấn đề. Của tôi sử dụng không gian có độ rộng bằng không, vì vậy hãy cẩn thận khi bạn chỉnh sửa.
Tim

2

Trường hợp đầu tiên:

echo $'$foo'

Mà echos $foo(có nghĩa là đầu tiên $trong lệnh echo của tôi bị loại bỏ)

Đầu tiên $được chạy như một lệnh. Echo không yêu cầu khoảng trắng giữa các đối số, nó chỉ cần chúng.

Vì vậy, echo $'$foo'mở rộng để chạy lệnh $(không phải là lệnh để nó bỏ qua nó) và sau đó echo '$foo'. Bất cứ điều gì trong ''được thực hiện theo mệnh giá - nó không mở rộng nó hoặc bất cứ điều gì. Bạn có thể đặt những gì bạn muốn vào '' và không có gì xảy ra.

Nếu bạn thay thế $bằng $$nó sẽ lặp lại ID tiến trình.


Thứ hai:

echo $"$foo"

Echos này pwd(có nghĩa là bash mở rộng $foo, biến của tôi, đến giá trị của nó)

Đó là bởi vì ""không ngăn cản nó mở rộng. ""thường được sử dụng để đảm bảo có một giá trị để so sánh với.

Nếu bạn có một biến có thể trống (ví dụ: đó là từ grepkết quả) thì bạn muốn so sánh với một giá trị / biến khác, bạn phải đặt biến đầu tiên vào "". Điều này đảm bảo rằng luôn có sự so sánh để kiểm tra, thay vì chỉ là một đoạn mã trống (như bash thấy) gây ra lỗi.


Cuối cùng, số 3. Điều này thật thú vị.

echo $`$foo`

Echos này $~/scripts(tôi dự kiến ​​nó sẽ in ~/scriptsvà không $~/scripts)

Đó là bởi vì (trong trường hợp này) echo đang in $ký tự đầu tiên. Đặt một cái gì đó vào backticks làm cho giá trị của biến được chạy dưới dạng một lệnh (cách tốt hơn để làm điều đó trong các phiên bản bash gần đây là $(command))

Vì vậy, đầu tiên nó vang lên $sau đó nó mở rộng ​`$foo`​để ​`pwd`​chạy và trả về ~/Scripts. Nhưng chúng tôi đã có $bản in sớm hơn - vì vậy toàn bộ đầu ra là $~/Scripts.


Làm việc tốt trên một số định dạng rất khó khăn!
Arronical

1
@Arronical Cảm ơn :) Bạn không thể nhìn thấy nó nhưng có một số khoảng trống có độ rộng bằng không cho câu cuối cùng. Những điều tôi làm cho các điểm internet tưởng tượng ...!
Tim

1
+1 Câu trả lời hay. Tôi chỉ muốn thêm rằng các biến trích dẫn phải là mặc định trừ khi bạn có lý do cụ thể không - không chỉ để xử lý các giá trị null có thể. Xem unix.stackexchange.com/questions/171346/ Khăn để biết nhiều hơn bạn từng muốn biết về điều này. ;)
Joe
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.