Có thể làm cho biến bên trong lồng cho vòng lặp cục bộ


9
#!/bin/bash
for i in  1 2 3 4
do

#   {
#   local i     ##gives error  local: can only be used in a function
    for i in 1 2 3
    do
    echo "inner loop ----- $i"
    (( i++ ))
    done
#   }
echo $i
done

ra ngoài :

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

Có thể làm cho biến bên trong lồng cho vòng lặp cục bộ.

Câu trả lời:


9

Nếu bạn chạy biến bên trong trong vỏ phụ, nó sẽ không ảnh hưởng đến biến ngoài:

for i in 1 2 3 4; do
    (
        for i in 1 2 3; do
            echo "inner loop ----- $i"
            (( i++ ))
        done
    )
    echo $i
done

Kết quả nào trong:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

1
Điều này là hợp lệ, nhưng xin vui lòng không. Nó làm cho điều này khó khăn hơn nhiều để đọc trong nháy mắt.
coteyr

1
Lạm dụng các subshells quá nhiều có thể làm cho một kịch bản chậm hơn đáng kể.
dùng23013

2
Nhưng khó hơn chỉ đọc cho những người không lạm dụng subshells.
dùng23013

9

Có thể làm cho biến bên trong lồng cho vòng lặp cục bộ.

Có, nhưng chỉ sử dụng một chức năng.

Vì nội dung localchỉ có thể tồn tại bên trong một hàm, chúng ta cần cung cấp một hàm để làm cho biến ithay đổi phạm vi từ toàn cục sang cục bộ:

#!/bin/bash

internalfunction () {
    local i     ### Works as is inside a function
    for i in 1 2 3; do
        echo "inner loop ----- $i"
        (( i++ ))
    done
}

for i in  1 2 3 4; do
    echo $i
    internalfunction
done

$ ./script.sh
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3

1
Cũng hợp lệ, và dễ đọc hơn nhiều.
coteyr

chỉ lưu ý rằng việc sử dụng chỉ {} làm cho các biến local.declareing var sử dụng declarecũng làm cho nó trở thành cục bộ
munish

1
@munish Không, chỉ { }là không đủ. Có, khai báo tạo một var local Bên trong một hàm .
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.