Định nghĩa biến trong bash bằng từ khóa cục bộ


33

Tôi đang học kịch bản bash và tìm thấy điều này trên / usr / share / bash-xong, dòng 305:

local cword words=()

Nó làm gì? Tất cả các hướng dẫn trực tuyến chỉ ở định dạng

local var=value

Câu trả lời:


92

Mặc dù tôi thích câu trả lời được đưa ra bởi jordanm nhưng tôi nghĩ điều quan trọng không kém là chỉ cho Linuxngười dùng ít kinh nghiệm hơn cách tự đối phó với những câu hỏi như vậy.

Cách được đề xuất là nhanh hơn và linh hoạt hơn so với tìm kiếm câu trả lời tại các trang ngẫu nhiên hiển thị trên trang kết quả tìm kiếm của Google.

Đầu tiên, tất cả các lệnh có thể được chạy trong Bashmà không cần nhập một đường dẫn rõ ràng đến nó, chẳng hạn như ./commandcó thể được chia thành hai loại: Bash shell builtinsexternal commands. Bash shell builtinsđược cài đặt với Bashvà là một phần của nó trong khi external commandskhông phải là một phần của Bash. Điều này rất quan trọng vì Bash shell builtinsđược ghi lại bên trong man bashvà tài liệu của họ cũng có thể được gọi bằng helplệnh trong khi external commandsthường được ghi lại theo cách riêng của họ manpageshoặc lấy một số vua -h, --helpcờ. Để kiểm tra xem một lệnh là một Bash shell builtinhoặc một external command:

$ type local
local is a shell builtin

Nó sẽ hiển thị how command would be interpreted if used as a command name(từ help type). Ở đây chúng ta có thể thấy đó locallà một shell builtin. Hãy xem một ví dụ khác:

$ type vim
vim is /usr/bin/vim

Ở đây chúng ta có thể thấy đó vimkhông phải là shell builtinmột lệnh bên ngoài /usr/bin/vim. Tuy nhiên, đôi khi cùng một lệnh có thể được cài đặt cả hai external commandshell builtincùng một lúc. Thêm -avào typedanh sách tất cả các khả năng, ví dụ:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Ở đây chúng ta có thể thấy đó echolà cả a shell builtinvà an external command. Tuy nhiên, nếu bạn chỉ cần gõ echovà ép Returnmột shell builtinsẽ được gọi là bởi vì nó xuất hiện đầu tiên trong danh sách này. Lưu ý rằng tất cả các phiên bản echonày không cần phải giống nhau. Ví dụ, trên hệ thống của tôi /usr/bin/echo--helpcờ trong khi builtinkhông.

Ok, bây giờ khi chúng ta biết rằng đó locallà một vỏ được xây dựng, hãy tìm hiểu cách thức hoạt động của nó:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Lưu ý dòng đầu tiên: name[=value]. Tất cả mọi thứ giữa []tùy chọn . Đó là một quy ước phổ biến được sử dụng trong nhiều manpagesvà hình thức tài liệu trên *nixthế giới. Điều đó đang được nói, lệnh bạn hỏi về câu hỏi của bạn là hoàn toàn hợp pháp. Đổi lại, ...ký tự có nghĩa là đối số trước đó có thể được lặp lại. Bạn cũng có thể đọc về quy ước này trong một số phiên bản của man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Vì vậy, vào cuối ngày, tôi hy vọng rằng bây giờ bạn sẽ dễ dàng hiểu được các lệnh khác nhau trong Linuxcông việc như thế nào .


5
Câu trả lời rất hay. Tôi đã đọc qua nó với hy vọng bạn sẽ giải quyết làm thế nào một người mới bắt đầu có thể tự mình khám phá ra việc gán mảng là gì, chỉ từ mã var=(), nhưng tôi cho rằng có một chút gì đó để tìm ra mà không cần biết tên của những gì bạn đang tìm kiếm . ;)
tự đại diện

Do shell không bash localcũng hỗ trợ ?
palswim

2
Tôi đã đăng nhập chỉ để tôi có thể nâng cao câu trả lời của bạn :)
Harendra Singh

@Wildcard Vì mảng là cú pháp bash trái ngược với lệnh, bạn có thể tìm thấy nó được định nghĩa trong man bash. Khi ở đó, gõ /Arrays$để nhảy đến phần trên mảng. (Việc theo $sau Arrayslà để ngăn chặn việc đi xe đạp qua các tham chiếu trong văn bản đến phần.) Từ đó bạn có thể nhập fđể chuyển tiếp một trang hoặc bđể đi lùi. Nhập qđể thoát khỏi trang man khi bạn hoàn thành.
Taylor Edmiston

Ngoài ra, chạy helpkhông có đối số sẽ liệt kê tất cả các nội dung bash nếu bạn tò mò muốn xem thêm.
Taylor Edmiston

29

Các localtừ khóa có thể có nhiều biến. Cung cấp biến với một giá trị là tùy chọn. Ví dụ của bạn khai báo hai biến cwordwords. Các wordsbiến được gán một mảng trống.


18

localchỉ cần khai báo một biến chỉ có phạm vi trong hàm được xác định hiện tại, để môi trường thực thi chính không thể "nhìn thấy" giá trị. Bạn không thể sử dụng localbên ngoài một chức năng. Thí dụ

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Đầu ra: Biến không cục bộ

Vì vậy, $onlyherekhông thể nhìn thấy bên ngoài phạm vi của chức năng.


Câu trả lời này có ý nghĩa hơn những người đang cần một sự hiểu biết nhanh chóng.
Alex Raj Kaliamoorthy
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.