2010-08-16 29 views
14

Given:Làm thế nào để bash biết nơi tên biến của tôi kết thúc?

myvar=Hello 
  • echo $myvar -> Hiển thị Hello (tốt cho đến nay)
  • echo $myvar#world -> cho thấy Hello#world (lý do tại sao tôi nghĩ rằng nó sẽ phàn nàn rằng ở đây không có biến như vậy gọi là myvar#world?)
  • echo ${myvar#world} -> chỉ hiển thị Hello (một lần nữa, tại sao?)
+1

oops, không biết điều đó. Đã chấp nhận một số bây giờ bằng cách nhấp vào dấu kiểm. – sunny8107

Trả lời

22

Trường hợp thứ hai chia thành ba phần:

[echo] [$myvar][#world] 
1  2  3 

Phần 1 được lệnh, phần 2 là một tham số, và một phần 3 là một chuỗi chữ. Tham số dừng trên r kể từ khi # không thể là một phần của tên biến (# 's không được phép vào tên biến.)

Các phân tích cú pháp shell sẽ nhận ra sự khởi đầu của một tên tham số bởi $, và kết thúc bởi bất kỳ ký tự nào không thể là một phần của tên biến. Thông thường chỉ có chữ cái, số và dấu gạch dưới được cho phép trong một tên biến, bất cứ điều gì khác sẽ cho biết vỏ mà bạn đã hoàn thành xác định tên của biến.

Tất cả trong số này sẽ in ra $myvar Tiếp theo sáu chữ đen:

echo $myvar world 
echo $myvar?world 
echo $myvar#world 

Nếu bạn muốn đặt nhân vật mà có thể là một phần của một tham số trực tiếp sau khi các thông số, bạn có thể bao gồm niềng răng xung quanh tên tham số , như thế này:

myvar=hello 
echo ${myvar}world 

mà in ra:

helloworld 

Trường hợp thứ ba của bạn là substring removal, ngoại trừ không khớp. Để làm điều gì đó thú vị, hãy thử thay vào đó:

myvar="Hello World" 
echo ${myvar#Hello } 

chỉ in World.

+0

Tôi có phần thứ hai, trong trường hợp đầu tiên mặc dù, nó vẫn còn in ra #, vì vậy đầu ra là Hello # thế giới thay vì Hello world – sunny8107

+0

Chỉnh sửa có làm cho nó rõ ràng hơn không? – Douglas

6

biến không thể chứa "#" để shell biết nó không phải là một phần của biến.

Các cấu trúc $ {myvar # thế giới} thực sự là một chuỗi thao túng giải thích dưới đây:

# là actuially một modifier chuỗi sẽ xóa phần đầu tiên của việc tìm kiếm một "thế giới". Vì không có chuỗi phù hợp với thế giới trong myvar chỉ echos lại "hello"

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