2010-10-13 8 views
16

Nếu tôi có biến chứa ký hiệu đô la chưa thoát, có cách nào tôi có thể lặp lại toàn bộ nội dung của biến không?Làm thế nào để echo một biến chứa ký hiệu đô la chưa thoát trong bash

Ví dụ một cái gì đó gọi là một kịch bản:

./script.sh "test1$test2"

và sau đó nếu tôi muốn sử dụng các tham số nó được "cắt ngắn" như vậy:

echo ${1}
test1

Tất nhiên đơn trích dẫn tên biến thể không hữu ích. Tôi không thể tìm ra cách để báo giá nó để tôi có thể ít nhất thoát khỏi ký hiệu đô la bản thân mình khi kịch bản nhận được tham số.

Trả lời

7

Biến được thay thế trước khi tập lệnh được chạy.

./script.sh 'test1$test2' 
+0

Có, trường hợp này có vẻ như vậy :) – Not22

+0

Có những tình huống khác mặc dù tôi thực sự có các biến với ký hiệu đô la chưa thoát, như khi tôi đọc dữ liệu từ tệp. Sau đó tôi muốn gọi kịch bản của tôi với dữ liệu này, do đó, nó là lựa chọn duy nhất của tôi để sed toàn bộ tập tin trước khi đọc nó? – Not22

+1

Đọc dữ liệu từ các tệp không thay đổi biến. –

28

Vấn đề là tập lệnh nhận "test1" ở vị trí đầu tiên và không thể biết rằng có tham chiếu đến biến trống (không khai báo). Bạn phải thoát khỏi $ trước khi đi qua nó để kịch bản, như thế này:

./script.sh "test1\$test2" 

Hoặc sử dụng dấu nháy đơn ' như thế này:

./script.sh 'test1$test2' 

Trong trường hợp đó bash sẽ không mở rộng biến từ đó chuỗi tham số .

0

Như Ignacio đã nói với bạn, biến được thay thế, vì vậy tập lệnh của bạn nhận được ./script.sh test1 làm giá trị cho $0$1.

Nhưng ngay cả trong trường hợp bạn đã sử dụng dấu ngoặc kép để vượt qua đối số, bạn luôn luôn báo giá "$1" trong số echo "${1}" của mình. Đây là một thực hành tốt.

+0

Và niềng răng là * không * cần thiết, vì đây là một sự thay thế đơn giản. –

+0

có chúng không cần thiết. Sử dụng chúng chỉ là tùy chọn. – Benoit

4

bằng cách sử dụng dấu ngoặc đơn, các ký tự meta như $ sẽ giữ lại giá trị bằng chữ. Nếu dấu ngoặc kép được sử dụng, tên biến sẽ được nội suy.