Có cách nào để in giá trị bên trong biến trong trích dẫn đơn không?


10

Hãy xem xét tôi đã đặt biến sitevà cần được in bằng echohoặc printf, nhưng nếu tôi sử dụng một trích dẫn để viết một cái gì đó và muốn sử dụng biến thì làm thế nào?

Thí dụ:

$ site=unix.stackexchange.com
$ echo "visit:$site"
visit:unix.stackexchange.com

Nhưng nếu tôi sử dụng trích dẫn duy nhất:

$ echo 'visit:$site'
visit:$site

Sau đó, chúng tôi biết rằng đó ''là trích dẫn mạnh mẽ và sẽ không mở rộng biến

Tôi đã thử một cái gì đó:

$ echo 'visit:"$site"'
visit:"$site"

nhưng không thành công. Vì vậy, tôi đang tìm cách in giá trị bên trong biến trong khi sử dụng trích dẫn đơn .


4
Tại sao bạn cần nó?
choroba

1
echo 'visite:"'$site'"'? (hoặc echo "visite:\"$site\""nhưng nó không phải là trích dẫn đơn lẻ)
fredtantini

@fredtantini không, điều này dường như cũng kết thúc một trích dẫn đầu tiên
Pandya

@choroba đã đăng một câu trả lời rất giống với bình luận của tôi. Biến trích dẫn nên được ưu tiên (ví dụ 'visit:"'"$site"'"')
fredtantini

2
Tại sao bạn muốn sử dụng búa làm tuốc nơ vít?
kos

Câu trả lời:


21

Bạn không thể mở rộng các biến trong dấu ngoặc đơn. Bạn có thể kết thúc dấu ngoặc đơn và bắt đầu dấu ngoặc kép, mặc dù:

echo 'visit:"'"$site"'"'

Hoặc, bạn có thể gạch chéo hai dấu ngoặc kép bên trong dấu ngoặc kép:

echo "visit:\"$site\""

Tôi thích sử dụng dấu gạch chéo ngược, ý tưởng tốt!
KiwenLau

8

Khi bạn xử lý việc in nội dung biến, bạn nên gắn bó với printf thay vì echo :

printf 'visit:%s\n' "$site"

sẽ xuất ra visit:theo sau bởi nội dung $sitevà một dòng mới bất kể ký tự trong $site.


0

Nếu tôi hiểu đúng yêu cầu của bạn, bạn có thể eval (uate) chuỗi lặp lại. Ví dụ:

# eval echo 'visit:$site'
visit:unix.stackexchange.com

1
Dường như những gì được yêu cầu là đầu ra 'visit:unix.stackexchange.com', với dấu ngoặc đơn.
Kusalananda

1
Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn bạn @drgnfr! Trình diễn đầy đủ: cd /var && QUOTED='cd $HOME' && echo $QUOTED && $(eval echo "$QUOTED")- lệnh đầu tiên chuyển bạn đến một thư mục cụ thể, cuối cùng bạn sẽ ở trong thư mục HOME của mình
Chris

-1

choroba là chính xác.

Mặc dù nếu đây là một câu đố, tôi sẽ trả lời:

cat << EOF | sh
> echo 'visit:$site'
> EOF

Như jander chỉ ra điều này là mở rộng cho một cuộc tấn công tiêm. Đó không phải là một câu trả lời nghiêm túc, vì vậy nếu bất cứ ai đang cân nhắc sử dụng một cái gì đó như thế này, đừng sử dụng nó với đầu vào không đáng tin cậy. Ví dụ: xác thực $sitechuỗi là một URL hợp lệ trước khi thực hiện một cách mù quáng nội dung. Một cái gì đó như thế này có thể giúp ích (nhưng biểu thức được cung cấp không hoàn hảo vì nó vẫn cho phép tiêm, nhưng sử dụng loại cơ chế đó để kiểm tra nó).


Tôi nghĩ EOF(chính nó) làm việc như (một) trích dẫn duy nhất (đại loại như bash -c 'echo 'visit:$site'':)!
Pandya

4
Tôi hy vọng $sitekhông chứa '\nrm -rf /\necho '!
Jander
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.