Nội suy biến trong shell


103

Tôi có một biến được gọi là filepath=/tmp/name.

Để truy cập biến, tôi biết rằng tôi có thể thực hiện điều này: $filepath

Trong tập lệnh shell của tôi, tôi đã cố gắng làm điều gì đó như thế này (các dấu gạch ngược là nhằm mục đích)

`tail -1 $filepath_newstap.sh`

Dòng này không thành công, duuh !, vì biến không được gọi $filepath_newstap.sh

Làm cách nào để nối _newstap.shvào tên biến?

Xin lưu ý rằng dấu gạch ngược dành cho việc đánh giá biểu thức.

Câu trả lời:


186

Sử dụng

"$filepath"_newstap.sh

hoặc là

${filepath}_newstap.sh

hoặc là

$filepath\_newstap.sh

_là một ký tự hợp lệ trong số nhận dạng. Dot thì không, vì vậy shell đã cố gắng nội suy $filepath_newstap.

Bạn có thể sử dụng set -uđể làm cho trình bao thoát khi gặp lỗi khi bạn tham chiếu đến một biến không xác định.


7
Cũng có thể đề cập đến set -unguyên nhân khiến tập lệnh bị hủy bỏ nếu bạn tham chiếu đến một biến không xác định.
tripleee

1
Sự khác biệt giữa việc sử dụng ${}và dấu ngoặc kép là gì? Tôi có nên thích cái này hơn cái kia không?
user31389 Ngày

3
@ user31389: Sự khác biệt là khi biến chứa khoảng trắng, thì chỉ có dấu ngoặc kép hoạt động.
choroba

@choroba Các biến tên hoặc biến giá trị ?
Joshua Pinter

15

Sử dụng dấu ngoặc nhọn xung quanh tên biến:

`tail -1 ${filepath}_newstap.sh`

1
Bạn không cần dấu ngoặc kép?
michaelsnowden

@michaelsnowden Không nhất thiết. Để an toàn, có, nhưng câu hỏi đã nêu rõ ràng một con đường không có khoảng trắng và gợi ý thêm rằng rắc rối đang $filepath_newstap.shđược diễn giải ${filepath_newstap}.shthay vì dự định ${filepath}_newstap.sh, điều này sẽ giải quyết được vấn đề.

@michaelsnowden Điều đó cho tôi biết không có gì mà tôi chưa biết. Tại sao bạn nghĩ rằng dấu ngoặc kép là cần thiết?

Bởi vì bạn đang cố gắng để làm chuỗi suy, và bạn cần dấu ngoặc kép cho điều đó
michaelsnowden

@michaelsnowden Mở rộng tham số xảy ra trong dấu ngoặc kép hoặc hoàn toàn bên ngoài dấu ngoặc kép. Dấu ngoặc kép đơn hoặc các ký tự phân tách bằng dấu ngoặc kép hoặc các ký tự khác không hợp lệ trong mã định danh là cách duy nhất để ngăn việc mở rộng tham số. Ví dụ: "$filepath"_foo${filepath}_foocả hai sẽ mở rộng thành /tmp/name_foo. Tuy nhiên, '$filepath'_foo, "$"filepath_foo, và $"filepath"_foosẽ mở rộng tất cả tránh hoàn toàn. Đây là lý do tại sao export PATH=$PATH:$addpathhoạt động để thêm :$addpath(sẽ được mở rộng tham số) vào PATHbiến môi trường.

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.