2012-02-08 27 views
10

Tôi tìm thấy một số hành vi lạ trong mảng xung quanh Powershell và dấu nháy kép. Nếu tôi tạo và in phần tử đầu tiên trong một mảng, chẳng hạn như:Powershell xuất ra các mục mảng khi nội suy trong ngoặc kép

Mọi thứ đều hoạt động tốt. Nhưng nếu tôi đặt dấu ngoặc kép xung quanh nó:

echo "$test[0]" 

Output: 
testing[0] 

Chỉ biến $ test được đánh giá và đánh dấu mảng [0] được xử lý theo nghĩa đen dưới dạng chuỗi. Việc sửa chữa dễ dàng là chỉ cần tránh nội suy các biến mảng trong dấu nháy kép, hoặc gán chúng cho biến khác trước tiên. Nhưng tôi đã tự hỏi nếu hành vi này là do thiết kế?

+0

Điều này không rõ ràng, nhưng cuối cùng đây là bản sao của [Làm cách nào bạn có thể sử dụng thuộc tính của đối tượng trong chuỗi được trích dẫn kép?] (Http://stackoverflow.com/q/ 1145704/45375). – mklement0

Trả lời

15

Vì vậy, khi bạn đang sử dụng nội suy, theo mặc định, nó sẽ nội suy chỉ biến tiếp theo trong toto. Vì vậy, khi bạn làm điều này:

"$test[0]" 

Nó thấy kiểm tra $ là biến tiếp theo, nó nhận ra rằng đây là một mảng và rằng nó không có cách nào tốt để hiển thị một mảng, vì vậy nó quyết định nó không thể suy và chỉ hiển thị chuỗi dưới dạng chuỗi. Giải pháp là để nói một cách rõ ràng PowerShell nơi chút để suy bắt đầu và nơi nó dừng lại:

"$($test[0])" 

Lưu ý rằng hành vi này là một trong những lý do chính của tôi cho việc sử dụng chuỗi định dạng thay vì dựa vào nội suy:

"{0}" -f $test[0] 
+0

Tôi đã tranh luận quay lại và thêm các thẻ mã, nhờ @Andy Arismendi. – EBGreen

+1

Giải pháp của bạn có hiệu quả, nhưng lời giải thích của bạn không chính xác. Nội suy chuỗi được _syntactically_ giới hạn chỉ phân tích cú pháp '$ '. Bất kỳ ký tự nào không hợp lệ trong tên biến sẽ phân tích cú pháp, chẳng hạn như '[' trong trường hợp này. PowerShell vui vẻ mở rộng mảng _entire_ '$ test', cụ thể là bằng cách tách các phần tử với một khoảng trống duy nhất giữa các phần tử (theo mặc định). '[0]' sau đây được xử lý đơn giản dưới dạng chữ và không có dấu hiệu về cách '$ test' được chuyển thành một chuỗi. – mklement0

6

Trong trường hợp này bạn phải làm:

echo "$($test[0])" 

Một lựa chọn khác là sử dụng chuỗi định dạng

echo "this is {0}" -f $test[0] 

Lưu ý rằng đây cũng là trường hợp bạn cũng truy cập các thuộc tính trong chuỗi. Giống như "$a.Foo" - phải được viết là "$($a.Foo)"

Các vấn đề liên quan