Hãy xem xét kịch bản sau đây (cú pháp số học được sử dụng cho local_var2 là không thích hợp cho trường hợp này):Sự khác nhau giữa ksh và bash script
#!/bin/ksh
function my_func1
{
typeset local_var1=one
typeset local_var2
((local_var2 = 1))
echo my_func1: local_var1 = $local_var1, local_var2 = $local_var2
}
my_func2()
{
typeset local_var1=two
typeset local_var2
((local_var2 = 2))
echo my_func2: local_var1 = $local_var1, local_var2 = $local_var2
}
local_var1=0
local_var2=0
echo before functions: local_var1 = $local_var1, local_var2 = $local_var2
my_func1
echo after my_func1: local_var1 = $local_var1, local_var2 = $local_var2
my_func2
echo after my_func2: local_var1 = $local_var1, local_var2 = $local_var2
Khi chạy nó sẽ cho kết quả như sau:
before functions: local_var1 = 0, local_var2 = 0
my_func1: local_var1 = one, local_var2 = 1
after my_func1: local_var1 = 0, local_var2 = 0
my_func2: local_var1 = two, local_var2 = 2
after my_func2: local_var1 = two, local_var2 = 2
(không phải là điều mong đợi!)
Nếu tôi chạy cùng một tập lệnh trong bash, đầu ra là:
before functions: local_var1 = 0, local_var2 = 0
my_func1: local_var1 = one, local_var2 = 1
after my_func1: local_var1 = 0, local_var2 = 0
my_func2: local_var1 = two, local_var2 = 2
after my_func2: local_var1 = 0, local_var2 = 0
(đó là những gì được mong đợi!)
kiểm tra và xác nhận đầu ra! Mặc dù, ngoài việc nói rằng ksh hút, tôi không có lời giải thích cho điều này ;-) – zmo
với một 'set -vx' trong mã (và mỗi hàm phụ thuộc shell) bạn sẽ thấy rằng nội dung của varaible rõ ràng là khác nhau của dự kiến tại lần đầu tiên sử dụng lệnh gọi thứ hai – NeronLeVelu