Phạm vi mặc định của biến là toàn bộ tập lệnh.
Tuy nhiên, khi bạn khai báo một biến bên trong một hàm, biến sẽ trở thành cục bộ cho hàm khai báo nó. Ksh có dynamic scoping, do đó, biến cũng có thể truy cập được trong các hàm được gọi bởi hàm khai báo biến. Điều này được ghi lại trong section on functions in the manual. Lưu ý rằng trong AT & T ksh (ngược với pdksh và các dẫn xuất, và các tính năng tương tự của bash và zsh), điều này chỉ áp dụng cho các hàm được xác định với từ khóa function
, không cho các hàm được xác định với cú pháp truyền thống f() { … }
. Trong AT & T ksh93, tất cả các biến được khai báo trong các hàm được xác định bằng cú pháp truyền thống là toàn cầu.
Cách chính để khai báo biến là với typeset
builtin. Nó luôn tạo một biến cục bộ (trong AT & T ksh, chỉ trong các hàm được khai báo với function
). Nếu bạn gán cho một biến mà không khai báo nó với typeset
, nó là toàn cục.
Tài liệu ksh không chỉ định liệu set -A
có biến cục bộ hay toàn cầu hay không và các phiên bản khác nhau cũng sẽ làm cho nó trở thành. Theo ksh 93u, pdksh hoặc mksh, biến là toàn cục và tập lệnh của bạn không in ra giá trị. Bạn dường như có ksh88 hoặc phiên bản cũ hơn của ksh, nơi phạm vi là cục bộ. Tôi nghĩ rằng việc khởi tạo str
bên ngoài hàm sẽ tạo ra một biến toàn cầu, nhưng tôi không chắc chắn.
Lưu ý rằng bạn nên sử dụng biến cục bộ để ghi đè giá trị IFS
: lưu vào biến khác không chỉ vụng về, nó còn giòn vì không khôi phục được IFS
đúng cách nếu không được đặt. Hơn nữa, bạn nên tắt globbing, bởi vì nếu không, nếu chuỗi chứa các ký tự bao quanh shell ?*\[
và một trong các từ xảy ra để khớp với một hoặc nhiều tệp trên hệ thống của bạn, nó sẽ được mở rộng, ví dụ: set -A $string
trong đó string
là a;*
sẽ dẫn đến str
chứa danh sách tên tệp trong thư mục hiện tại.
set -A str
function splitString {
typeset IFS=';' globbing=1
case $- in *f*) globbing=;; esac
set -f
set -A str $string
if [ -n "$globbing" ]; then set +f; fi
}
splitString "$string"
Gotcha !!!! Tập lệnh hiện đang hoạt động, không có vấn đề gì với nó. Đã thực hiện một sai lầm nhỏ trong việc gọi hàm theo cách sai. Tuy nhiên, vẫn muốn hiểu phạm vi của các biến trong KSH – Vivek