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ừ grep
kế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 ~/scripts
và 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
.